2016-06-14 12 views
0

Ich bin über die modelforms Helfer lernen, und es ist mein Verständnis, dass Best Practice für Formularvalidierung wird einfach das Formular in ein DB Modellobjekt nach einem einfachen Code wie so gespart werden:Saving Django Forms DB

def my_view(request): 
    # if this is a POST request we need to process the form data 
    if request.method == 'POST': 
     # create a form instance and populate it with data from the request: 
     form = MyForm(request.POST) 
     # check whether it's valid: 
     if form.is_valid(): 

      form.save() 

      return redirect somewhere 

    else: 
     form = MyForm() 

return render(request, 'mysite.html', {'form': form})  

Es gibt jedoch zusätzliche Daten, die ich diesem Modellobjekt hinzufügen möchte, das nicht explizit im Formular enthalten ist. Was ist zum Beispiel, wenn ich dem Objekt einen Datumsstempel hinzufügen möchte, der auf der Serverseite generiert wird? Wie gehe ich vor, um mehr Informationen in dasselbe Modellobjekt zu speichern, und welche Best Practices dafür?

+0

Was meinst du mit 'mehr Daten'? Mehr Felder zu einem Modell? – trantu

+0

Call Save mit 'commit = False'. Es gibt Hunderte von Beispielen zu SO. –

+0

Mit mehr Daten meine ich mehr Felder. Angenommen, ich habe ein Feld in meinem Modell, das eine Datumszeit erstellt hat, aber ich möchte dieses Datum auf der Serverseite und nicht über das Formular generieren. Wie füge ich diese zusätzlichen Felder nachträglich dem Modellobjekt in der DB hinzu? – DudeDudeDude

Antwort

0

Für trackin Erstellung/Änderung Daten sind Sie die ‚Datetimefield‘ verwenden:

created = models.DateTimeField(auto_now_add=True, editable=False) 
updated = models.DateTimeField(auto_now=True, editable=False) 

auto_now_add die aktuelle datetime einfügt, wenn ein neues Objekt erstellen, während auto_now das gleiche tut, wenn die Aktualisierung.

Für eine spezifischere Logik könnten Sie die Signale post_save oder pre_save verwenden oder die Methode save überschreiben.

# overriding save 
class MyModel(models.Model): 
    # ... 
    def save(self, *args, **kwargs): 
     self.my_field = 'whatever' 
     super(MyModel, self).save(*args, **kwargs) 

.

# using signals 
from django.db.models.signals import pre_save 
from django.dispatch.dispatcher import receiver 

@receiver(pre_save, sender=MyModel) 
def message_post_save(sender, instance, **kwargs): 
    instance.my_field = 'whatever'