Любое поле с установленным auto_nowатрибутом также будет наследоваться editable=Falseи, следовательно, не будет отображаться в панели администратора. В прошлом были разговоры о том, чтобы аргументы auto_nowи auto_now_addисчезли, и, хотя они все еще существуют, я чувствую, что вам лучше использовать собственный save()метод .
Поэтому для правильной работы я бы рекомендовал не использовать auto_nowили auto_now_addвместо этого определять собственный save()метод, чтобы убедиться, что createdон обновляется только в том случае, если idон не установлен (например, при первом создании элемента), и обновлять его modifiedкаждый раз, когда элемент сохраняется
Я проделал то же самое с другими проектами, написанными мной с использованием Django, и вы save()выглядите так:
from django.utils import timezone
class User(models.Model):
created = models.DateTimeField(editable=False)
modified = models.DateTimeField()
def save(self, *args, **kwargs):
''' On save, update timestamps '''
if not self.id:
self.created = timezone.now()
self.modified = timezone.now()
return super(User, self).save(*args, **kwargs)
Надеюсь это поможет!
Редактировать в ответ на комментарии:
Причина, по которой я просто придерживаюсь перегрузки по save()сравнению с этими аргументами поля, имеет две причины :
- Вышеупомянутые взлеты и падения с их надежностью. Эти аргументы в значительной степени зависят от того, как каждый тип базы данных, с которой Django знает, как взаимодействовать, обрабатывает поле отметки даты / времени, и, кажется, ломается и / или изменяется между каждым выпуском. (Который я полагаю, является стимулом для вызова, чтобы удалить их полностью).
- Тот факт, что они работают только с DateField, DateTimeField и TimeField, и с помощью этого метода вы можете автоматически заполнять поля любого типа каждый раз, когда элемент сохраняется.
- Используйте
django.utils.timezone.now()против datetime.datetime.now(), потому что он будет возвращать TZ-осведомленный или наивный datetime.datetimeобъект в зависимости от settings.USE_TZ.
Чтобы выяснить, почему ОП увидел ошибку, я точно не знаю, но похоже, что createdона даже не заполняется вообще, несмотря на то, что имеет auto_now_add=True. Для меня это выделяется как ошибка, и подчеркивает пункт # 1 в моем маленьком списке выше: auto_nowи auto_now_addв лучшем случае ненадежен.