Django表单 - 如何使用前缀参数
假设我有一个这样的表单:
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 ...
当用户提交这个表单时,我该如何把提交的内容分成两个独立的表单来进行验证,然后再重新显示出来呢?
这是我找到的唯一文档,内容不太详细。
2 个回答
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从一个模型自动生成表单集,这个功能在自动化的Django管理后台中会用到。表单集比简单的表单能处理更多的事情,比如添加、删除和排序项目。
39
你可以像平常一样处理每个表单,确保你创建的实例使用的前缀和最初生成表单时的前缀是一样的。
这里有一个稍微有点尴尬的例子,使用了你给的表单,因为我不太清楚具体的使用场景:
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/