Für Anfänger, die alle Grundfunktionen von Django genutzt haben.
Dies ist eine Erklärung der Anfangswerteinstellungen, von denen Sie sich bei der Verwendung des Formulars abhängig fühlen. Beachten Sie, dass in der Beschreibung möglicherweise nicht klar zwischen Form / ModelForm unterschieden wird.
Lassen Sie uns zunächst ein grobes Bild des Formulars veranschaulichen.
Als nächstes werden die Haupteingabeelemente des Formulars dargestellt (Elemente des Arguments der Methode \ _ \ _ init \ _ \ _ ()).
Das Folgende zeigt, was jedes Eingabeelement entspricht.
Das offizielle Dokument enthält eine Beschreibung, dass "die Unterscheidung zwischen gebunden / ungebunden wichtig ist", aber es ist schwierig, das Verhalten des Formulars zu verstehen, wenn Sie dies nicht gedrückt halten. Die Definition von gebunden / ungebunden lautet wie folgt.
Dies ist auch im Quellcode der BaseForm-Klasse zu sehen.
#Teil des Codes für die BaseForm-Klasse
self.is_bound = data is not None or files is not None
Hier sind einige Beispiele dafür, mit welchen Argumenten ein Formular instanziiert werden kann, um es gebunden (oder ungebunden) zu machen.
# Bound/Beispiel für ein ungebundenes Formular
form_bound_1 = SomeForm(request.GET)
form_bound_2 = SomeForm(request.POST)
form_bound_3 = SomeForm(request.POST, request.FILES)
form_unbound_1 = SomeForm()
form_unbound_2 = SomeForm(initial={"some_field": "some_valule"})
form_unbound_3 = SomeModelForm(initial={"some_field": "some_valule"}, instance=some_instance)
form_bound_4 = SomeModelForm(request.POST, initial={"some_field": "some_valule"}, instance=some_instance)
Die bisher gesehenen "Haupteingabeelemente des Formulars" und "Gebunden / Ungebunden" beziehen sich auf die Einstellung des Anfangswertes. Das Formular definiert ein oder mehrere Eingabefelder oder Felder. Schauen wir uns jedoch den Code an, in dem jedes Feld einen Wert zum Rendern des HTML-Markups erhält.
#BoundField-Klassenmethode
def value(self):
"""
Return the value for this BoundField, using the initial value if
the form is not bound or the data otherwise.
"""
data = self.initial
if self.form.is_bound:
data = self.field.bound_data(self.data, data)
return self.field.prepare_value(data)
Aus dem Obigen können wir ersehen, dass gebundene Formularfeldwerte keine Anfangsbuchstaben </ b> verwenden (überschreiben). Beachten Sie außerdem, dass request.GET usw. leer ist (≠ None), es sich jedoch um eine gebundene Form </ b> handelt.
Wenn Sie ein Suchformular erstellen oder Ajax verwenden möchten, um dies auf einem Bildschirm zu tun, können Sie die Anfangswerteinstellung durch Verzweigen wie folgt aktivieren. (Der Code ist nur ein Beispiel.)
if "some_field" in request.GET:
form = SomeForm(request.GET)
else:
form = SomeForm(initial={"some_field": "some_value"})
Das Problem tritt nicht auf, während die Modellerstellung und die Modellaktualisierung in einzelnen Ansichten ausgeführt werden. Es kann jedoch süchtig machen, sobald Sie mit der Anwendung beginnen.
Außerdem ist zu beachten, dass die Werte der Formularfelder in der folgenden Prioritätsreihenfolge festgelegt werden. (Um genau zu sein, ist es wie ein "Prioritätsbild", das gebundene / ungebundene Unterschiede usw. ignoriert.)
In ModelForm scheint der Standardwert von Model die Initiale des Formularfelds zu sein, dies scheint jedoch nicht der Fall zu sein.
Die Teile "Bound / Unbound" und "Initial Value Setting" sind schwer vorstellbar, daher ist es eine gute Idee, Ihr Verständnis zu vertiefen.
Recommended Posts