2010-08-07 6 views
85

Was ist der beste Weg, um ein Erstellungsdatum für ein Objekt automatisch festzulegen, und auch ein Feld, das aufzeichnet, wenn das Objekt zuletzt aktualisiert wurde?Automatisches Erstellungsdatum für Django-Modell-Formularobjekte?

In meinem Modell habe ich:

created_at = models.DateTimeField(False, True, editable=False) 
updated_at = models.DateTimeField(True, True, editable=False) 

und meiner Ansicht nach:

if request.method == 'POST': 
    form = MyForm(request.POST) 
    if form.is_valid(): 
     obj = form.save(commit=False) 
     obj.user = request.user 
     obj.save() 
     return HttpResponseRedirect('obj_list') 

ich den Fehler:

objects_object.created_at may not be NULL 

Muss ich auf diesen Wert manuell eingestellt mich ? Ich dachte, das war der Punkt der Parameter, die an die DateTimeFields übergeben wurden (oder sind sie nur Standardwerte, und da ich 'editierbar = Falsch' gesetzt habe, werden sie nicht auf dem Formular angezeigt und werden daher nicht in der Anfrage eingereicht und deshalb nicht in die Form gebracht werden?).

Was ist der beste Weg, dies zu tun? Ein init Methode?

Dank

ps - ich bin ein django und Python-Neuling ...

Antwort

184

Sie die auto_now und auto_now_add Optionen für updated_at und created_at bzw. verwenden können.

class MyModel(models.Model): 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 
+14

'auto_now' und' auto_now_add' werden als böse betrachtet, also versuchen Sie, sie zu vermeiden. [Diese Antwort] (http://stackoverflow.com/a/1737078/1226722) erklärt warum und bietet eine bessere Methode, die 'save()' Methode zu überschreiben. – gregoltsov

+2

es erzeugt diesen Fehler: 'Sie versuchen, ein nicht nullbares Feld 'created_at' zu Gameuser ohne einen Standard hinzuzufügen; Das können wir nicht tun (die Datenbank benötigt etwas, um vorhandene Zeilen zu füllen). Bitte wählen Sie einen fix: 1) Geben Sie einen einmaligen Standard jetzt (wird Beenden Sie auf alle vorhandenen Zeilen) 2) eingestellt werden, und lassen Sie mich eine Standard in models.py hinzufügen Wählen Sie eine Option: 1 Bitte geben Sie die Standardwert jetzt, als gültig Python Die Module datetime und django.utils.timezone sind verfügbar, so dass Sie z timezone.now() >>> timezone.now() ' –

+0

löschen Sie die Zeilen in den Datenbanken, oder aktivieren Sie Option 1 und fügen Sie timezone.now() hinzu – mullerivan

Verwandte Themen