说我有一个像这样的表格:
class GeneralForm(forms.Form): field1 = forms.IntegerField(required=False) field2 = forms. IntegerField(required=False)
我希望每次使用不同的前缀在一个表单标记内的页面上显示两次,例如:
rest of page ...rest of page ...
当用户提交此内容时,如何将提交的表单恢复为两个单独的表单以进行验证,并重新显示它?
这是我能找到的唯一文件,而且非常糟糕.
您可以像往常一样处理每个表单,确保您创建的实例与最初生成表单的前缀相同.
这是使用您给出的表单的一个稍微尴尬的示例,因为我不知道确切的用例是什么:
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/
更好的是,我认为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))
您甚至可以使用自动django管理员使用的modelformset_factory模型自动生成一个formset .FormSet处理的东西比简单的表单更多,比如添加,删除和排序项目.