Параметры по умолчанию Django DateField
У меня есть модель, у которой есть поле даты даты:
date = models.DateField(_("Date"), default=datetime.now())
Когда я проверяю приложение во встроенном администраторе django, у DateField также есть время, добавленное к нему, так что если вы попытаетесь его сохранить, он вернет ошибку. Как сделать по умолчанию только дату? (datetime.today() также не работает)
Ответы
Ответ 1
Вот почему вы должны всегда импортировать базовый модуль datetime
: import datetime
, а не класс datetime
в этом модуле: from datetime import datetime
.
Другая ошибка, которую вы сделали, - это фактически вызвать функцию по умолчанию, используя ()
. Это означает, что все модели получат дату во время определения класса, поэтому, если ваш сервер будет оставаться в течение нескольких дней или недель без перезапуска Apache, все элементы получат такую же начальную дату.
Итак, поле должно быть:
import datetime
date = models.DateField(_("Date"), default=datetime.date.today)
Ответ 2
Вы ошибаетесь, используя модуль datetime вместо модуля даты. Вы хотели это сделать:
from datetime import date
date = models.DateField(_("Date"), default=date.today)
Если вы хотите захватить текущую дату, правильный способ справиться с этим - использовать параметр auto_now_add:
date = models.DateField(_("Date"), auto_now_add=True)
Тем не менее, modelfield docs четко заявляют, что auto_now_add и auto_now всегда будут использовать текущую дату и не являются значением по умолчанию, которое вы можете переопределить.
Ответ 3
date = models.DateTimeField(default=datetime.now, blank=True)
Ответ 4
Это должно сделать трюк:
models.DateTimeField(_("Date"), auto_now_add = True)
Ответ 5
Вы также можете использовать lambda
. Полезно, если вы используете django.utils.timezone.now
date = models.DateField(_("Date"), default=lambda: now().date())
Ответ 6
Я думаю, что лучший способ решить эту проблему - использовать функцию datetime:
from datetime import datetime
date = models.DateField(default=datetime.now)
Благодарим Джанго Мусингса. Я использовал это и работает отлично.