Warum sollte ich jemals verwenden, save(commit=False)
anstatt nur ein Formularobjekt aus der ModelForm
Unterklasse zu erstellen und auszuführen?is_valid()
, um sowohl das Formular als auch das Modell zu validieren?
Mit anderen Worten, wofür ist save(commit=False)
?
Wenn es Ihnen nichts ausmacht, könnten Sie dann hypothetische Situationen angeben, in denen dies nützlich sein könnte?
django
django-models
django-forms
sgarza62
quelle
quelle
form = forms.SampleForm(instance = models.Sample)
)commit=False
wenn Sie Ihr Formular in einemCBV
mit bearbeitendef form_valid
? Können Sie nurform.instance.[field]
zum Aktualisieren verwenden?Hier ist die Antwort ( aus den Dokumenten ):
Die häufigste Situation besteht darin, die Instanz aus dem Formular abzurufen, jedoch nur im Speicher, nicht in der Datenbank. Bevor Sie es speichern, möchten Sie einige Änderungen vornehmen:
quelle
commit=False
wenn Sie Ihr Formular in einemCBV
mit bearbeitendef form_valid
? Können Sie nurform.instance.[field]
zum Aktualisieren verwenden?Aus den Django-Dokumenten:
Es scheint, dass save (commit = False) eine Modellinstanz erstellt, die an Sie zurückgegeben wird. Welches ist ordentlich für einige Nachbearbeitung, bevor es tatsächlich gespeichert wird!
quelle
Stellen Sie sich als "echtes Beispiel" ein Benutzermodell vor, bei dem die E-Mail-Adresse und der Benutzername immer identisch sind. Anschließend können Sie die Speichermethode Ihres ModelForm wie folgt überschreiben:
Wenn Sie
commit=False
den Benutzernamen nicht auf die E-Mail-Adresse festgelegt haben, müssen Sie entweder die Speichermethode des Benutzermodells ändern oder das Benutzerobjekt zweimal speichern (wodurch eine teure Datenbankoperation dupliziert wird).quelle
commit=False
wenn Sie Ihr Formular in einemCBV
mit bearbeitendef form_valid
? Können Sie nurform.instance.[field]
zum Aktualisieren verwenden?Hier ist mein Beispiel für die Verwendung von save (commit = False). Ich wollte überprüfen, welchen Dateityp ein Benutzer hochgeladen hat, bevor ich ihn in der Datenbank speichere. Ich wollte auch das Datum erhalten, an dem es angehängt war, da dieses Feld nicht im Formular war.
quelle