1

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

当我向这个文件发送获取请求时,我在控制台中有这个输出:

在以清洁方式渲染
init之前

当我写 {{ form.text }} 而不是 {{ form.as_p }} 我只有:

在渲染
初始化之前

我觉得 as_p 方法在渲染模板的过程中内部调用了 clean() 。在此之前我提到过 as_p 方法只是某种快捷方式(我理解它是 Form 类的方法),并没有实现逻辑。
为什么会这样?它是一个错误还是一些有用的功能?

Django 版本==1.5.1

4

3 回答 3

2

据我在源代码中看到的 django 有一个 _html_output 辅助函数来返回函数 form.as_p()。如果有数据绑定到表单(如您的表单),则调用 BaseForm 类属性错误。此函数将表单称为完全清洁。所以我认为这种行为是故意呈现表单错误。

于 2013-07-04T14:08:13.060 回答
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()不会再被调用

于 2013-07-04T15:37:24.193 回答
0

问题是我不正确的初始化表单,我应该使用Form(initial={#something#})

于 2013-07-04T15:23:49.300 回答