0

我想编写一个显示多个表单的视图,一个用于对象查询返回的每个模型实例。这样,用户可以一次填写多个表格,然后将所有对象的数据保存在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整个页面的单个按钮,以便页面中每个表单的数据与其关联的表单一起发送回并保存到数据库中相应的相应对象。这可能吗?

4

2 回答 2

3

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

如果您想采用您的方法(每页不止一个表单,或每页不止一个 FormSet),请使用以下prefix属性: https ://docs.djangoproject.com/en/dev/ref/forms/api/#subclassing-表单 并仅使用一个<form>带有单个Submit按钮的标签。

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

于 2013-05-08T05:50:32.450 回答
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})
于 2013-05-08T05:53:13.100 回答