Setiap bidang dengan auto_now
set atribut juga akan mewarisi editable=False
dan karenanya tidak akan muncul di panel admin. Telah ada pembicaraan di masa lalu tentang membuat auto_now
dan auto_now_add
argumen hilang, dan meskipun masih ada, saya merasa Anda lebih baik hanya menggunakan metode kustomsave()
.
Jadi, untuk membuat ini berfungsi dengan baik, saya akan merekomendasikan untuk tidak menggunakan auto_now
atau auto_now_add
dan sebaliknya mendefinisikan save()
metode Anda sendiri untuk memastikan bahwa created
hanya diperbarui jika id
tidak disetel (seperti ketika item pertama kali dibuat), dan minta pembaruan modified
setiap kali item disimpan.
Saya telah melakukan hal yang sama persis dengan proyek lain yang saya tulis menggunakan Django, dan Anda save()
akan terlihat seperti ini:
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)
Semoga ini membantu!
Edit dalam menanggapi komentar:
Alasan mengapa saya bertahan dengan kelebihan beban save()
vs mengandalkan argumen lapangan ini adalah dua kali lipat:
- Pasang surut tersebut dengan keandalannya. Argumen ini sangat bergantung pada cara masing-masing jenis database yang Django tahu bagaimana berinteraksi dengan memperlakukan bidang cap tanggal / waktu, dan tampaknya pecah dan / atau berubah di antara setiap rilis. (Yang saya percaya adalah dorongan di balik panggilan untuk menghapusnya sama sekali).
- Fakta bahwa mereka hanya bekerja pada DateField, DateTimeField, dan TimeField, dan dengan menggunakan teknik ini Anda dapat secara otomatis mengisi setiap jenis bidang setiap kali item disimpan.
- Gunakan
django.utils.timezone.now()
vs. datetime.datetime.now()
, karena akan mengembalikan objek TZ-aware atau naif datetime.datetime
tergantung settings.USE_TZ
.
Untuk mengatasi mengapa OP melihat kesalahan, saya tidak tahu persis, tetapi sepertinya created
bahkan tidak diisi sama sekali, meskipun sudah auto_now_add=True
. Bagi saya itu menonjol sebagai bug, dan menggarisbawahi item # 1 dalam daftar kecil saya di atas: auto_now
dan paling auto_now_add
tidak terkelupas.