问题是由于这 3 个表单完全相同,尤其是它们在呈现的 HTML 代码中具有相同的字段名称。让我举例说明。
想象你的表单是:
class TheForm(forms.Form):
the_field = forms.CharField(label="Field")
在渲染完你的模板之后,你会得到差不多这样的代码:
<form method="POST">
<input type="hidden" name="csrftoken" value="some-token">
<p>
<label for="id_the_field">Field</label>
<input type="text" name="the_field" id="id_the_field">
</p>
<p>
<label for="id_the_field">Field</label>
<input type="text" name="the_field" id="id_the_field">
</p>
<p>
<label for="id_the_field">Field</label>
<input type="text" name="the_field" id="id_the_field">
</p>
<button class="waves-effect waves-light btn"> Button </button>
</form>
如您所见,所有 3 个表单都有相同的字段,包括输入字段的名称。如果要提交此表单,则这些字段之间没有区别,因此 Django 端的所有 3 个表单都将收到相同的值(在您的情况下,它来自第 3 个表单,但在某些情况下可能会有所不同)。
要解决这个问题,您可以使用不同的前缀初始化每个表单,如下所示:
if request.method == "POST":
form1 = TheForm(request.POST, prefix="form1")
form2 = TheForm(request.POST, prefix="form2")
form3 = TheForm(request.POST, prefix="form3")
if form1.is_valid() and form2.is_valid() and form3.is_valid():
form1.save()
form2.save()
form3.save()
return HttpResponseRedirect(...)
else:
return render(....)
else:
form1 = TheForm(prefix="form1")
form2 = TheForm(prefix="form2")
form3 = TheForm(prefix="form3")
现在,呈现的 HTML 将如下所示:
<form method="POST">
<input type="hidden" name="csrftoken" value="some-token">
<p>
<label for="id_form1_the_field">Field</label>
<input type="text" name="form1_the_field" id="id_form1_the_field">
</p>
<p>
<label for="id_form2_the_field">Field</label>
<input type="text" name="form2_the_field" id="id_form2_the_field">
</p>
<p>
<label for="id_form2_the_field">Field</label>
<input type="text" name="form3_the_field" id="id_form3_the_field">
</p>
<button class="waves-effect waves-light btn"> Button </button>
</form>
如您所见,现在字段具有不同的不同名称,因此当用户提交时,它们将由浏览器单独发送回您的 Django 后端。
您可以在Django docs 中找到有关表单前缀的更多信息