我有这个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>
当我向此文件发送get请求时,我在控制台中输出了这个:
在渲染中初始化之前
当我写{{form.text}}而不是{{form.as_p}}时,我只有:
在渲染初始化之前
我联系到as_p方法在渲染模板的过程中在内部调用clean()。
在此之前我提到as_p方法只是某种快捷方式(我知道它是Form类的一种方法)并且没有实现逻辑。
为什么会这样?这是一个错误还是一些有用的功能?
Django版本== 1.5.1
答案 0 :(得分:2)
据我所知,在源代码中,django有一个_html_output辅助函数来返回函数form.as_p()。如果有与表单绑定的数据(与您的一样),则会调用BaseForm类属性错误。此函数调用表单完全清理。所以我认为这种行为是故意渲染表单错误。
答案 1 :(得分: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()
将不再被调用
答案 2 :(得分:0)
问题是我取消了初始化表单,我应该使用Form(initial={#something#})