【发布时间】:2023-09-17 04:17:01
【问题描述】:
我想编写一个显示多个表单的视图,每个表单对应一个对象查询返回的模型实例。这样,用户可以一次填写多个表格,然后所有对象的数据都保存在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 按钮之一时,该表单对应于该 @987654325 @按钮只将其数据发送到我的视图,然后继续将该数据保存到form_list中的所有表单中,从而将相同的数据写入我数据库中的所有相应对象(这显然不是我想要的) .
我想要的是整个页面的单个Submit 按钮,以便页面中每个表单的数据与其关联的表单一起发送回并保存到数据库中相应的相应对象。这可能吗?
【问题讨论】:
-
浏览器只会发送与您的提交按钮相关的表单,而不会提交其他表单。这只是 W3C 浏览器行为。因此,每个
<form>都有自己的方法(GET/POST)和操作 URI。您想要的是使用现在已经回答的 FormSet;请注意,它使用单个表单元素来呈现。
标签: django django-forms