在我的数据库中,我记录了2016年的年份,但我需要将其更改为2017年。当我使用Django admin来更改它时,我会得到“确保这个值小于或等于2016”。我的模型出什么问题了?
class Track (models.Model):
artist = models.ForeignKey(Artist, blank=True, null=True, on_delete=models.SET_NULL, verbose_name="Artist")
title = models.CharField(max_length=100, verbose_name="Title")
year = models.PositiveSmallIntegerField(null=True, blank=True, validators=[MinValueValidator(1900), MaxValueValidator(datetime.datetime.now().year)], verbose_name="Year")
timestamp = models.DateTimeField(default=timezone.now)发布于 2017-01-02 07:09:17
这是django模型/表单等的典型问题!当第一次读取源文件时,验证器中的datetime.datetime.now().year代码只执行一次。它不是每次提交表单时都执行的!所以当它第一次被执行的时候,它的价值是2016年,现在仍然有相同的价值。
要快速理解我的观点,请重新启动您的应用程序服务器--那么应该可以了(模型将被重新评估,2017年将作为datetime.date.today().year!)。当然,要真正解决这个问题,您必须更改验证逻辑,以使用每次提交表单时都将运行的自定义验证器(不能使用MaxValueValidator)。
例如:
def my_year_validator(value):
if value < 1900 or value > datetime.datetime.now().year:
raise ValidationError(
_('%(value)s is not a correcrt year!'),
params={'value': value},
)
...
# And then in your model:
year = models.PositiveSmallIntegerField(
null=True,
blank=True,
validators=[my_year_validator],
verbose_name="Year"
)https://stackoverflow.com/questions/41422565
复制相似问题