Django DateField default options
我有一个具有日期时间字段的模型:
1
| date = models.DateField(_("Date"), default=datetime.now()) |
当我在内置的django admin中检查该应用程序时,dateField还附加了时间,因此如果您试图保存它,它会返回一个错误。如何使默认值仅为日期?(datetime.today()也不工作)
这就是为什么您应该始终导入基本的datetime模块:import datetime,而不是该模块中的datetime类:from datetime import datetime。
您犯的另一个错误是使用()在默认情况下实际调用函数。这意味着所有模型都将在第一次定义类时获得日期——因此,如果服务器在没有重新启动Apache的情况下保持运行数天或数周,那么所有元素都将获得相同的初始日期。
所以字段应该是:
1 2
| import datetime
date = models.DateField(_("Date"), default=datetime.date.today) |
- 有没有办法增加一个时间增量?例如:default=datetime.date.today+datetime.timedelta(days=4)…这个代码不起作用,但这就是主意。(当然,save方法是这样做的一个地方,但只是想知道是否有一种方法可以作为定义的一部分来这样做)
- @乔J:这真是个新问题。但是,您可以使用可调用的事实意味着您可以定义自己的函数,它将返回今天的+4。
- _("Date")在做什么?
- @Benregn给字段贴上了"日期"的标签,但使用国际化系统将其标记为翻译。
- 感谢你的澄清,我刚刚开始Django Dev,我有点不清楚它是否在做更多的只是标签。
- 这会在管理系统中显示日期时引起问题:Caught AttributeError while rendering: 'datetime.date' object has no attribute 'date'有什么想法吗?
- @Benregn国际化需要包括EDOCX1[2]
- @jdero或在这种特殊情况下,您希望使用lazy版本,因此from django.utils.translation import gettext_lazy as _在导入时的其他评估将吐出一个"不准备就绪的预感"。
- django.utils.timezone中似乎缺少此功能,是否有解决方法?
您错误地使用了日期时间模块而不是日期模块。你想这样做:
1 2
| from datetime import date
date = models.DateField(_("Date"), default=date.today) |
如果只想捕获当前日期,正确的处理方法是使用auto_now_add参数:
1
| date = models.DateField(_("Date"), auto_now_add=True) |
号
但是,modelfield文档清楚地声明auto-now和auto-now将始终使用当前日期,并且不是可以覆盖的默认值。
1
| date = models.DateTimeField(default=datetime.now, blank=True) |
- DateTimeField不同。如果将datetime作为datefield的默认值提供,则会遇到问题。
这应该可以做到:
1
| models.DateTimeField(_("Date"), auto_now_add = True) |
。
- 我的朋友我认为你读错了。问题是关于日期字段,而不是关于日期时间字段。
您也可以使用lambda。如果您正在使用django.utils.timezone,则非常有用。
1
| date = models.DateField(_("Date"), default=lambda: now().date()) |
。
- 查看文档。使用lambda作为默认的可调用包装是不好的:Note that lambdas cannot be used for field options like default because they cannot be serialized by migrations. See that documentation for other caveats.。
我认为解决这个问题的更好方法是使用日期时间可调用:
1 2 3
| from datetime import datetime
date = models.DateField(default=datetime.now) |
。
注意,没有使用括号。如果使用括号,则只需调用一次now()函数(在创建模型时)。相反,您将可调用作为参数传递,因此每次创建模型实例时都会调用它。
归功于姜戈沉思。我已经用过了,而且工作得很好。