首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django年验证返回2017年“确保此值小于或等于2016”

Django年验证返回2017年“确保此值小于或等于2016”
EN

Stack Overflow用户
提问于 2017-01-02 06:58:47
回答 1查看 2.9K关注 0票数 6

在我的数据库中,我记录了2016年的年份,但我需要将其更改为2017年。当我使用Django admin来更改它时,我会得到“确保这个值小于或等于2016”。我的模型出什么问题了?

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-02 07:09:17

这是django模型/表单等的典型问题!当第一次读取源文件时,验证器中的datetime.datetime.now().year代码只执行一次。它不是每次提交表单时都执行的!所以当它第一次被执行的时候,它的价值是2016年,现在仍然有相同的价值。

要快速理解我的观点,请重新启动您的应用程序服务器--那么应该可以了(模型将被重新评估,2017年将作为datetime.date.today().year!)。当然,要真正解决这个问题,您必须更改验证逻辑,以使用每次提交表单时都将运行的自定义验证器(不能使用MaxValueValidator)。

例如:

代码语言:javascript
复制
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"
)
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41422565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档