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 № 1Soweit 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#})