Każde pole z auto_nowustawionym atrybutem również odziedziczy editable=Falsei dlatego nie pojawi się w panelu administracyjnym. W przeszłości mówiono o tym, aby argumenty auto_nowi auto_now_addzniknęły, i chociaż nadal istnieją, uważam, że lepiej jest po prostu skorzystać z niestandardowej save()metody .
Tak więc, aby to działało poprawnie, odradzam używanie auto_nowlub auto_now_addzamiast tego zdefiniowanie własnej save()metody, aby upewnić się, że createdjest aktualizowana tylko wtedy, gdy idnie jest ustawiona (na przykład przy pierwszym tworzeniu elementu), i niech aktualizuje się za modifiedkażdym razem, gdy element jest zapisany.
Zrobiłem dokładnie to samo z innymi projektami, które napisałem przy użyciu Django, więc save()wyglądałoby to tak:
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)
Mam nadzieję że to pomoże!
Edytuj w odpowiedzi na komentarze:
Powód, dla którego po prostu trzymam się przeciążenia save()kontra poleganie na tych argumentach pola, jest dwojaki:
- Wspomniane wzloty i upadki z ich niezawodnością. Argumenty te są bardzo zależne od sposobu, w jaki każdy typ bazy danych, z którym Django wie, jak wchodzić w interakcje, traktuje pole znacznika daty / godziny i wydaje się, że ulega uszkodzeniu i / lub zmianie między poszczególnymi wersjami. (Uważam, że jest to impuls do wezwania do całkowitego ich usunięcia).
- Fakt, że działają one tylko na DateField, DateTimeField i TimeField, a dzięki tej technice możesz automatycznie wypełniać dowolny typ pola za każdym razem, gdy element jest zapisywany.
- Użyj
django.utils.timezone.now()vs. datetime.datetime.now(), ponieważ w datetime.datetimezależności od tego zwróci obiekt rozpoznający TZ lub naiwny settings.USE_TZ.
Aby odpowiedzieć na pytanie, dlaczego OP widział błąd, nie wiem dokładnie, ale wygląda na to, że creatednawet nie jest w ogóle zaludniony, pomimo tego auto_now_add=True. Dla mnie wyróżnia się to jako błąd i podkreśla pozycję nr 1 na mojej małej liście powyżej: auto_nowi auto_now_addjest w najlepszym razie niestabilna.