Django日期域默认选项

wb1gzix0  于 2023-03-09  发布在  Go
关注(0)|答案(8)|浏览(173)

我有一个模型,其中有一个日期时间字段:

date = models.DateField(_("Date"), default=datetime.now())

当我在内置的django管理中检查应用时,DateField也有时间附加到它上面,所以如果你试图保存它,会返回一个错误。我如何使默认值只有日期?(datetime.today()也不工作)

1sbrub3j

1sbrub3j1#

这就是为什么您应该始终导入基本datetime模块:import datetime,而不是该模块中的datetime类:from datetime import datetime .
你犯的另一个错误是在默认情况下使用()来调用函数,这意味着所有的模型都将获得 * 类第一次定义时的日期 * -所以如果你的服务器几天或几周都没有重启Apache,所有的元素都将获得相同的初始日期。
因此,该字段应为:

import datetime
date = models.DateField(_("Date"), default=datetime.date.today)
ibrsph3r

ibrsph3r2#

您的错误是使用了datetime模块而不是date模块。您应该这样做:

from datetime import date
date = models.DateField(_("Date"), default=date.today)

如果只想捕获当前日期,正确的处理方法是使用auto_now_add参数:

date = models.DateField(_("Date"), auto_now_add=True)

然而,modelfield文档明确指出auto_now_addauto_now将 * 始终 * 使用当前日期,并且不是可以覆盖的默认值。

yizd12fk

yizd12fk3#

date = models.DateTimeField(default=datetime.now, blank=True)
uqcuzwp8

uqcuzwp84#

我认为解决这个问题的一个更好的方法是使用datetime可调用函数:

from datetime import datetime

date = models.DateField(default=datetime.now)

注意,这里没有使用括号,如果使用括号,now()函数只会被调用一次(当模型被创建时),而是将可调用对象作为参数传递,这样每次创建模型示例时都会被调用。
归功于Django Musings,我用过了,效果很好。

sg24os4d

sg24os4d5#

日期字段/DateTimeField.auto现在添加

当对象第一次创建时自动将字段设置为现在。对于创建时间戳很有用。注意总是使用当前日期;它不仅仅是一个你可以覆盖的默认值。所以即使你在创建对象时为这个字段设置了一个值,它也会被忽略。

来源:Django文档

这应该可以达到目的:

models.DateTimeField(_("Date"), auto_now_add = True)
ru9i0ody

ru9i0ody6#

您也可以使用lambda。如果您使用www.example.com,则此命令非常有用django.utils.timezone.now

date = models.DateField(_("Date"), default=lambda: now().date())
sigwle7e

sigwle7e7#

django提示

提示:您似乎设置了一个固定的日期/时间/日期时间值作为此字段的默认值。这可能不是您想要的。如果您希望将当前日期作为默认值,请使用django.utils.timezone.now

xnifntxz

xnifntxz8#

我在Django4.1.7版上试过了,效果非常好!
from datetime import datetime, date

purchase_date = models.DateField(auto_now_add=False, auto_now=False, blank=True)

def __str__(self): return f"{self.str(purchase_date)}"
返回这个字符串是完全可选的.无论你是否返回字符串都可以.

相关问题