Anche qualsiasi campo con l' auto_now
attributo impostato erediterà editable=False
e pertanto non verrà visualizzato nel pannello di amministrazione. In passato si è parlato di far sparire gli argomenti auto_now
e auto_now_add
, e sebbene esistano ancora, sento che stai meglio usando solo un metodo personalizzatosave()
.
Quindi, per far funzionare correttamente questo, consiglierei di non usare auto_now
o auto_now_add
e invece definire il proprio save()
metodo per assicurarsi che created
sia aggiornato solo se id
non è impostato (come quando l'elemento viene creato per la prima volta), e farlo aggiornare modified
ogni volta che l'articolo è salvato.
Ho fatto esattamente la stessa cosa con altri progetti che ho scritto usando Django, e quindi il tuo save()
sarebbe simile a questo:
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)
Spero che questo ti aiuti!
Modifica in risposta ai commenti:
Il motivo per cui mi limito a sovraccaricare save()
piuttosto che fare affidamento su questi argomenti di campo è duplice:
- Gli alti e bassi di cui sopra con la loro affidabilità. Questi argomenti dipendono fortemente dal modo in cui ogni tipo di database con cui Django sa come interagire tratta un campo data / ora e sembra rompersi e / o cambiare tra ogni versione. (Che credo sia l'impulso dietro la chiamata a rimuoverli del tutto).
- Il fatto che funzionano solo su DateField, DateTimeField e TimeField e utilizzando questa tecnica, è possibile popolare automaticamente qualsiasi tipo di campo ogni volta che viene salvato un elemento.
- Usa
django.utils.timezone.now()
vs. datetime.datetime.now()
, perché restituirà un oggetto TZ-aware o ingenuo a datetime.datetime
seconda settings.USE_TZ
.
Per capire perché l'OP abbia visto l'errore, non lo so esattamente, ma sembra che created
non sia nemmeno stato popolato, nonostante ciò auto_now_add=True
. Per me si distingue come un bug e sottolinea l'articolo 1 nella mia piccola lista sopra: auto_now
e auto_now_add
nella migliore delle ipotesi è traballante.