Django Forms - 如何使用前缀参数

时间:2008-10-22 16:10:04

标签: python html django forms

说我的表格如下:

class GeneralForm(forms.Form):
    field1 = forms.IntegerField(required=False)
    field2 = forms. IntegerField(required=False)

我希望每次使用不同的前缀在一个表单标记内的页面上显示两次,例如:。

rest of page ...
<form ..>
GeneralForm(data,prefix="form1").as_table()
GeneralForm(data,prefix="form2").as_table()
<input type="submit" />
</form>
rest of page ...

当用户提交此内容时,如何将提交的表单重新分成两个单独的表单进行验证,然后重新显示?

This was the only documentation我能找到并且它太棒了。

2 个答案:

答案 0 :(得分:31)

您可以像往常一样处理每个表单,确保您创建的实例与最初用于生成表单的前缀相同。

这是使用您提供的表单的一个稍微尴尬的示例,因为我不知道确切的用例是什么:

def some_view(request):
    if request.method == 'POST':
        form1 = GeneralForm(request.POST, prefix='form1')
        form2 = GeneralForm(request.POST, prefix='form2')
        if all([form1.is_valid(), form2.is_valid()]):
            pass # Do stuff with the forms
    else:
        form1 = GeneralForm(prefix='form1')
        form2 = GeneralForm(prefix='form2')
    return render_to_response('some_template.html', {
        'form1': form1,
        'form2': form2,
    })

这是一些真实的示例代码,它使用前缀

演示处理表单

http://collingrady.wordpress.com/2008/02/18/editing-multiple-objects-in-django-with-newforms/

答案 1 :(得分:6)

更好的是,我认为formsets正是您正在寻找的。

class GeneralForm(forms.Form):
    field1 = forms.IntegerField(required=False)
    field2 = forms. IntegerField(required=False)

from django.forms.formsets import formset_factory

# GeneralSet is a formset with 2 occurrences of GeneralForm 
# ( as a formset allows the user to add new items, this enforces
#   2 fixed items, no less, no more )
GeneralSet = formset_factory(GeneralForm, extra=2, max_num=2)

# example view

def someview(request):
    general_set = GeneralSet(request.POST)
    if general_set.is_valid():
        for form in general_set.forms:
            # do something with data
    return render_to_response("template.html", {'form': general_set}, RequestContext(request))

您甚至可以使用modelformset_factory的模型自动生成一个formset,自动django管理员使用该模板。 FormSet处理的内容比简单表单更多,比如添加,删除和排序项目。