如何防止Django中过去几天添加DateField记录

时间:2013-04-01 21:11:27

标签: python django django-models django-admin

如果我在Django的模型中有一个DateField()字段,我该如何阻止为比今天更早的日期添加条目?

我可以在views.py级别上执行此操作,但它仍然可以从Django管理站点中利用。

更糟糕的是,我有一个设计决定在同一个模型中有单独的DateField()和TimeField()字段。我可以阻止加入旧版(日期+时间)而不是当前时间吗?预订过去的航班是没有意义的,即使它只有一个小时的时间。但问题是,我必须有单独的DateField()和TimeField();不是一个DateTimeField()。

1 个答案:

答案 0 :(得分:0)

也许尝试使用Model.clean()方法。这会在正确的位置引发ValidationError(在admin中显示表单错误而不是500)。

clean方法只允许过期日期保存在过去,只有当它是现有记录并且到期时间没有改变时。

from datetime import datetime
from django.core.exceptions import ValidationError

class MyModel(models.Model)

    expires = models.DateTimeField()

    def __init__(self, *args, **kwargs):
        super(Game, self).__init__(*args, **kwargs)
        self.__old_expires = self.expires

    def clean(self):
        " Make sure expiry time cannot be in the past "
        if (not self.id or self.__old_expires != self.expires)
           and self.expires <= datetime.now():
            raise ValidationError('MyModel entries cannot expire in the past.')

文档:https://docs.djangoproject.com/en/dev/ref/models/instances/#django.db.models.Model.clean