【问题标题】:Django Forms - How to Use Prefix ParameterDjango Forms - 如何使用前缀参数
【发布时间】:2010-09-18 14:20:09
【问题描述】:

假设我有这样的表格:

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我能找到,而且很饿。

【问题讨论】:

    标签: python html django forms


    【解决方案1】:

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

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

    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/

    【讨论】:

      【解决方案2】:

      更好的是,我认为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 管理员使用。 FormSet 处理比简单表单更多的东西,例如添加、删除和排序项目。

      【讨论】:

        猜你喜欢
        • 2015-02-08
        • 1970-01-01
        • 2013-11-12
        • 2013-01-17
        • 1970-01-01
        • 1970-01-01
        • 2010-09-17
        • 1970-01-01
        • 2023-03-26
        相关资源
        最近更新 更多