Django 日期验证,需要帮助
Django date validation, help needed
我试图验证我的 DateField 以仅接受今天和未来的日期,但我不知道为什么它仍然接受每个过去的日期。
我的 models.py 文件:
def present_or_future_date(value):
if value < datetime.date.today():
raise models.ValidationError("The date cannot be in the past!")
return value
class Event(models.Model):
title = models.CharField(max_length=50)
text = models.TextField()
date = models.DateField(default=datetime.now, validators=[present_or_future_date])
duration = models.TextField(default='0', blank='true')
created_at = models.DateTimeField(default=datetime.now, blank='true')
def __str__(self):
return self.title
正如 Benjamin 所说,验证器仅隐式添加到 ModelForms。更多关于验证器的文档 here.
如果你想确保没有对象可以用你的日期条件创建,你应该重写它的保存方法,如下所示。还要注意,虽然 Django 会处理简单的日期对象,但使用 django.utils.timezone.now
的方式更好
from django.db import models
import datetime
from django.core.exceptions import ValidationError
class Event(models.Model):
title = models.CharField(max_length=50)
text = models.TextField()
date = models.DateField(default=datetime.date.today())
duration = models.TextField(default='0', blank='true')
created_at = models.DateTimeField(default=datetime.datetime.now(), blank='true')
def save(self, *args, **kwargs):
if self.date < datetime.date.today():
raise ValidationError("The date cannot be in the past!")
super(Event, self).save(*args, **kwargs)
我试图验证我的 DateField 以仅接受今天和未来的日期,但我不知道为什么它仍然接受每个过去的日期。
我的 models.py 文件:
def present_or_future_date(value):
if value < datetime.date.today():
raise models.ValidationError("The date cannot be in the past!")
return value
class Event(models.Model):
title = models.CharField(max_length=50)
text = models.TextField()
date = models.DateField(default=datetime.now, validators=[present_or_future_date])
duration = models.TextField(default='0', blank='true')
created_at = models.DateTimeField(default=datetime.now, blank='true')
def __str__(self):
return self.title
正如 Benjamin 所说,验证器仅隐式添加到 ModelForms。更多关于验证器的文档 here.
如果你想确保没有对象可以用你的日期条件创建,你应该重写它的保存方法,如下所示。还要注意,虽然 Django 会处理简单的日期对象,但使用 django.utils.timezone.now
的方式更好from django.db import models
import datetime
from django.core.exceptions import ValidationError
class Event(models.Model):
title = models.CharField(max_length=50)
text = models.TextField()
date = models.DateField(default=datetime.date.today())
duration = models.TextField(default='0', blank='true')
created_at = models.DateTimeField(default=datetime.datetime.now(), blank='true')
def save(self, *args, **kwargs):
if self.date < datetime.date.today():
raise ValidationError("The date cannot be in the past!")
super(Event, self).save(*args, **kwargs)