[PYTHON] Beziehung zwischen gebunden / ungebunden und Anfangswert von Django2 Form

Annahme

Für Anfänger, die alle Grundfunktionen von Django genutzt haben.

Umgebung

Einführung

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.

Bild mit Formular

Lassen Sie uns zunächst ein grobes Bild des Formulars veranschaulichen. フォームイメージ1.png

Formular ausfüllen

Als nächstes werden die Haupteingabeelemente des Formulars dargestellt (Elemente des Arguments der Methode \ _ \ _ init \ _ \ _ ()). フォームイメージ2.png

Das Folgende zeigt, was jedes Eingabeelement entspricht.

data
request.GET, request.POST
files
request.FILES
Instanz
Modellinstanz / dd>
initial
Wörterbuch mit Anfangswerten

Was ist gebunden / ungebunden?

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.

Gebundenes Formular
Ein Formular mit den Namen request.GET, request.POST oder request.FILES
Ungebundenes Formular
Formular ohne Anfrage.GET, request.POST, request.FILES

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)

Beziehung zwischen gebunden / ungebunden und Anfangswert

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.

Gegenmaßnahmen

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.

Wertpriorität

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.)

  1. data (request.GET, request.POST)
  2. initial
  3. instance
  4. Anfangswert des Formularfelds ⇒ Ein Wert, der in der Formularfelddefinition als "some_field = forms.CharField (initial =" init value ")" festgelegt werden soll.

In ModelForm scheint der Standardwert von Model die Initiale des Formularfelds zu sein, dies scheint jedoch nicht der Fall zu sein.

abschließend

Die Teile "Bound / Unbound" und "Initial Value Setting" sind schwer vorstellbar, daher ist es eine gute Idee, Ihr Verständnis zu vertiefen.