Django多表单提交:一个表单覆盖所有表单对象

时间:2013-05-08 05:42:21

标签: django django-forms

我想编写一个显示多个表单的视图,每个表单对应一个对象查询返回的模型实例。这样,用户可以一次填写多个表单,然后在POST上保存所有对象的数据。这就是我所拥有的:

查看:

def formView(request, attr):
     object_list = MyModel.objects.filter(attribute1=attr)
     if request.method == 'POST':
          form_list = [MyModelForm(request.POST, instance=x) for x in object_list]
          if all(form.is_valid for form in form_list):
              for form in form_list:
                  form.save()
              return HttpResponseRedirect('/thanks/')
     else:
          form_list = [MyModelForm(instance=x) for x in object_list]
     return render(request, 'formView.html', {'form_list':form_list})

HTML:

    <table>
        <thead>
            <tr>
                <th>Field1</th>
                <th>Field2</th>
                <th>Field3</th>
            </tr>
        </thead>
        <tbody>
            {% for form in form_list %}
            <tr>
                <form method="post">{% csrf_token %}
                {% for field in form %}
                <td>{{ field }}</td>
                {% endfor %}
                <td><input type="submit" value="Submit" /></td>
                </form>
            </tr>
            {% endfor %}
        </tbody>
    </table>

如果我错了,请纠正我,但这是我认为我的代码目前正在做的事情:当用户填写页面上的表单然后单击其中一个Submit按钮时,表单对应于Submit按钮仅将其数据发送到我的视图,然后该视图继续将该数据保存到form_list中的所有表单中,从而将相同的数据写入我的数据库中的所有相应对象(即显然不是我想要的)。

我想要的是整个页面的单个Submit按钮,以便页面中每个表单的数据与其关联的表单一起发回并保存到数据库中相应的对应对象。这可能吗?

2 个答案:

答案 0 :(得分:3)

您是否尝试过与模型关联的FormSet?您可以定义查询以选择要编辑的对象,Django会(几乎)处理所有内容。 https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#changing-the-queryset

如果您想要采用您的方法(每页多个表单,或每页多个FormSet),请使用prefix属性: https://docs.djangoproject.com/en/dev/ref/forms/api/#subclassing-forms 并且只使用一个<form>代码和一个Submit按钮。

示例: http://docs.djangoproject.com/en/dev/topics/forms/formsets/#using-more-than-one-formset-in-a-view

答案 1 :(得分:1)

尝试在表单中使用prefix,以便分别标识每个表单。 x.id对于前缀会更好。

类似的东西:

def formView(request, attr):
     object_list = MyModel.objects.filter(attribute1=attr)
     if request.method == 'POST':
          form_list = [MyModelForm(request.POST, instance=x, prefix=str(x.id)) for x in object_list]
          if all(form.is_valid for form in form_list):
              for form in form_list:
                  form.save()
              return HttpResponseRedirect('/thanks/')
     else:
          form_list = [MyModelForm(instance=x, prefix=str(x.id)) for x in object_list]
     return render(request, 'formView.html', {'form_list':form_list})