【问题标题】:Django date validation, help neededDjango 日期验证,需要帮助
【发布时间】:2018-05-20 21:04:50
【问题描述】:

我尝试验证我的 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

【问题讨论】:

  • 你的代码在validators之后真的缺少=吗?
  • 对不起,只是我在复制、编辑时出错。但这不是问题。
  • 何时接受这些日期?如果只是在Model.save() 上,默认情况下不会运行验证器。
  • 当它重定向到我的“add.html”并且用户输入他的数据时,他点击提交并继续保存到数据库。此字段无信息无验证:/
  • 查看处理此问题的表单会有所帮助。验证器应自动包含在 ModelForm 中,但不会隐含在自定义表单中。

标签: django validation datefield


【解决方案1】:

正如 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)

【讨论】:

  • 谢谢,但我应该把它粘贴到哪里?
  • 在您的模型定义中,就像它的 __str__ 方法(​​顺便说一句,在您的帖子中错误地缩进)。
  • AttributeError: 'method_descriptor' object has no attribute 'today' 它给了我这个,为什么它的意图是错误的?我应该如何改变它?
  • 你用的是哪个版本的python和django?
  • 使用docs.djangoproject.com/en/2.0/ref/contrib/messagestry: # object creation except ValidationError as e: # add error text to messages
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 2014-08-01
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
相关资源
最近更新 更多