Будь-яке поле з 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
в кращому випадку є лущими.