【问题标题】:How to prevent DateField record addition for past days in Django如何防止在 Django 中添加过去几天的 DateField 记录
【发布时间】:2013-03-23 00:44:45
【问题描述】:

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

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

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

【问题讨论】:

  • 考虑覆盖模型的save 方法。
  • 正如@karthikr 所说,覆盖 save() mehotd 会处理它,如果你有某种带有 JS 的 datepicker 小部件,你只能在 datepicker 上显示正确的日期。
  • 您是否可以曾经保存过去的日期?即对于过去的事件,您是否可以编辑其信息但不保留日期?
  • @karthikr 你好。如果您可以详细说明一个示例并将其放在答案中,那么我可以尝试您的解决方案并接受您的答案!
  • @Thomas 抱歉,我不明白你在说什么。

标签: python django django-models django-admin


【解决方案1】:

也许可以试试Model.clean() 方法。这将在正确的位置引发ValidationErrors(将在管理员中显示表单错误而不是 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

【讨论】:

  • 如果我想修改旧记录(修改日期以外的字段),这会引发错误吗?
  • 它只检查 seldf.expires &lt;= datetime.now() 是否是全新的记录,或者您是否更改了 expires 字段的值。因此,您可以安全地修改旧记录的任何其他字段的值。
猜你喜欢
  • 2012-06-27
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
  • 2022-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多