Имам тази извадка от код на django:
# 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"
и този шаблон:
#test.html
<form id="test-form" method="post" action="some url" enctype="multipart/form-data">
{{ form.as_p }}
<input type="submit" value="Save"/>
</form>
когато изпратя заявка за получаване на този файл, имам този изход в конзолата:
преди рендеринга
в него
в чисто
когато пиша {{form.text}} вместо {{form.as_p}} имам само:
преди рендеринга
в него
Струва ми се, че методът на as_p извиква clean ()вътрешно в процес на изобразяване на шаблон. Преди това споменах, че методът as_p е само някакъв пряк път (разбирам, че това е метод на клас клас) и не реализира логика.
Защо се случва? Това е грешка или някаква полезна функция?
Версия на Django == 1.5.1
Отговори:
2 за отговор № 1Доколкото виждам в източника django има a_html_output помощна функция за връщане на функцията form.as_p (). Ако има данни, свързани с формата (като вашата), тогава се извикват грешки в свойството на клас BaseForm. Тази функция нарича формулярите напълно чисти. Затова смятам, че това поведение умишлено е да създаде грешки във формата.
2 за отговор № 2
Променете изгледа си така:
# 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)
и clean()
няма да се нарича повече
0 за отговор № 3
Проблемът е, че аз отхвърлям инициализирането на формата, трябва да използвам Form(initial={#something#})