/ / Защо django form.as_p call form.clean метод, когато визуализира шаблон? - джанго, форми

Защо django form.as_p извика form.clean метод, когато шаблонът визуализира? - джанго, форми

Имам тази извадка от код на 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#})