Параметры Django DateField по умолчанию - PullRequest
67 голосов
/ 08 января 2010

У меня есть модель с полем даты и времени:

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

Когда я проверяю приложение во встроенном администраторе django, к DateField также добавляется время, поэтому, если вы попытаетесь сохранить его, оно вернет ошибку Как сделать по умолчанию только дату? (datetime.today () тоже не работает)

Ответы [ 6 ]

125 голосов
/ 08 января 2010

Вот почему вы должны всегда импортировать базовый модуль datetime: import datetime, а не класс datetime в этом модуле: from datetime import datetime.

Другая ошибка, которую вы допустили, заключается в том, чтобы фактически вызвать функцию по умолчанию с (). Это означает, что все модели получат дату во время первого определения класса - поэтому, если ваш сервер работает в течение нескольких дней или недель без перезапуска Apache, все элементы получат одинаковую начальную дату.

Итак, поле должно быть:

import datetime
date = models.DateField(_("Date"), default=datetime.date.today)
28 голосов
/ 08 января 2010

Вы ошиблись, используя модуль datetime вместо модуля date. Вы хотели это сделать:

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

Если вы хотите захватить только текущую дату, правильный способ справиться с этим - использовать параметр auto_now_add:

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

Однако в полях для модели четко указано, что auto_now_add и auto_now будут всегда использовать текущую дату и не являются значением по умолчанию, которое можно переопределить.

7 голосов
/ 01 февраля 2012
date = models.DateTimeField(default=datetime.now, blank=True)
3 голосов
/ 03 декабря 2011

Это должно сработать:

models.DateTimeField(_("Date"), auto_now_add = True)
1 голос
/ 28 мая 2014

Вы также можете использовать lambda. Полезно, если вы используете django.utils.timezone.now

date = models.DateField(_("Date"), default=lambda: now().date())
0 голосов
/ 23 мая 2019

Я думаю, что лучший способ решить эту проблему - использовать вызываемую дату и время:

from datetime import datetime

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

Обратите внимание, что скобки не использовались. Если бы вы использовали круглые скобки, вы бы вызвали функцию now() только один раз (при создании модели). Вместо этого вы передаете вызываемую функцию в качестве аргумента, вызывая ее каждый раз, когда создается экземпляр модели.

Кредит Django Musings . Я использовал его и отлично работает.

...