在这种方法中,我们将创建一个单独的 Django 视图函数来处理包含多个表单的页面。这个视图函数将负责渲染表单、处理表单提交以及在模板中显示错误信息。
我们可以在一个视图函数中创建多个表单实例,并根据请求的类型(GET 或 POST)执行相应的操作。在处理 POST 请求时,我们将逐个验证和处理每个表单,然后渲染回同一个页面,以便显示错误信息。
# views.py
from django.shortcuts import render
from .forms import Form1, Form2
def multi_form_view(request):
if request.method == 'POST':
form1 = Form1(request.POST)
form2 = Form2(request.POST)
if form1.is_valid() and form2.is_valid():
# 处理表单数据
# ...
else:
form1 = Form1()
form2 = Form2()
context = {
'form1': form1,
'form2': form2,
}
return render(request, 'template_name.html', context)
<!-- template_name.html -->
<form method="post">
{% csrf_token %}
{{ form1.as_p }}
{{ form2.as_p }}
<button type="submit">Submit</button>
</form>
通过一个视图函数处理多个表单是一种简单的方法,但随着表单数量的增加,视图函数可能会变得冗长。此方法适用于少量表单且逻辑相对简单的情况。
Django 提供了一个称为"formsets"的工具,它允许我们在一个视图中同时处理多个表单。Formsets 可以在模板中很方便地渲染和处理。
在这种方法中,我们首先需要创建表单类,然后使用 Django 的 Formset 来管理这些表单类。在视图函数中,我们可以使用 Formset 的工厂函数来初始化表单实例,并在处理请求时验证和处理这些表单。
# views.py
from django.forms import formset_factory
from django.shortcuts import render
from .forms import Form1, Form2
def multi_form_view(request):
Form1Set = formset_factory(Form1, extra=2)
Form2Set = formset_factory(Form2, extra=2)
if request.method == 'POST':
formset1 = Form1Set(request.POST, prefix='formset1')
formset2 = Form2Set(request.POST, prefix='formset2')
if formset1.is_valid() and formset2.is_valid():
# 处理表单数据
# ...
else:
formset1 = Form1Set(prefix='formset1')
formset2 = Form2Set(prefix='formset2')
context = {
'formset1': formset1,
'formset2': formset2,
}
return render(request, 'template_name.html', context)
<!-- template_name.html -->
<form method="post">
{% csrf_token %}
{{ formset1.management_form }}
{{ formset2.management_form }}
{{ formset1.as_table }}
{{ formset2.as_table }}
<button type="submit">Submit</button>
</form>
使用 Formsets 可以更有效地处理多个表单,因为它提供了内置的表单集合管理功能。这种方法适用于处理多个表单实例且逻辑相对较复杂的情况。