为什么django form.as_p在模板渲染时调用form.clean方法?

时间:2013-07-04 13:41:31

标签: django forms

我有这个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

3 个答案:

答案 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#})

相关问题