/ / Warum ruft django form.as_p die Methode form.clean auf, wenn die Vorlage gerendert wird? - Django, Formen

Warum ruft django form.as_p die form.clean-Methode auf, wenn die Vorlage gerendert wird? - Django, Formen

Ich habe dieses Beispiel für Django-Code:

# views.py
def test_view(request):
form = TestForm(
request.POST or { "text": "some text"},
)
data = {
"form": form,
}
print "before rendering"
return render(request, "test.html", data)

# forms.py
class TestForm(forms.Form):
text = forms.CharField()

def __init__(self, *args, **kwargs):
print "init"
super(TestForm, self).__init__(*args, **kwargs)

def clean(self):
print "in clean"

und diese Vorlage:

#test.html
<form id="test-form" method="post" action="some url" enctype="multipart/form-data">
{{ form.as_p }}
<input type="submit" value="Save"/>
</form>

Wenn ich eine Get-Anfrage an diese Datei sende, habe ich diese Ausgabe in der Konsole:

vor dem Rendern
drin
in sauber

Wenn ich {{form.text}} anstelle von {{form.as_p}} schreibe, habe ich nur:

vor dem Rendern
drin

Mir scheint, dass die as_p-Methode clean () aufruft.intern beim Rendern der Vorlage. Vorher habe ich erwähnt, dass die as_p-Methode nur eine Art Verknüpfung ist (ich verstehe, dass es sich um eine Methode der Form-Klasse handelt) und keine Logik realisiert.
Warum passiert das? Ist es ein Fehler oder eine nützliche Funktion?

Version von Django == 1.5.1

Antworten:

2 für die Antwort № 1

Soweit ich in der Quelle sehen kann, hat Django eineHilfsfunktion _html_output, um die Funktion form.as_p () zurückzugeben. Wenn Daten an das Formular gebunden sind (wie Ihre), werden die Eigenschaftsfehler der BaseForm-Klasse aufgerufen. Diese Funktion ruft die Formulare vollständig sauber auf. Ich denke also, dass dieses Verhalten absichtlich dazu dient, Formularfehler zu rendern.


2 für die Antwort № 2

Ändern Sie Ihre Ansicht folgendermaßen:

# views.py
def test_view(request):

if request.POST:
form = TestForm(request.POST)
# this is usually used when there"s an actual post request
# and in this block you do validation
else:
form = TestForm(initial={"somekey": "somevalue"})

data = {
"form": form,
}
print "before rendering"
return render(request, "test.html", data)

und clean() wird nicht mehr angerufen


0 für die Antwort № 3

Das Problem ist, dass ich das Formular nicht ordnungsgemäß initialisiere und verwenden sollte Form(initial={#something#})