Django 表单集合

2023-04-11 00:00:00 django 集合 表单

Django 表单集合(Form Sets)是一种允许用户在单个页面上提交多个表单数据的功能。表单集合通常用于需要用户提交多个类似数据的情况,例如添加多个商品、多个地址等。

使用 Django 表单集合,需要定义一个基础表单类(BaseForm),然后使用这个基础表单类创建表单集合(FormSet)。

以下是一个简单的示例,展示如何使用 Django 表单集合来创建一个添加多个网站链接的页面:

from django import forms
from django.forms import formset_factory

# 定义基础表单类
class LinkForm(forms.Form):
    name = forms.CharField(max_length=100)
    url = forms.URLField()

# 定义表单集合类
LinkFormSet = formset_factory(LinkForm, extra=3)

# 定义视图函数
def add_links(request):
    if request.method == 'POST':
        formset = LinkFormSet(request.POST)
        if formset.is_valid():
            for form in formset:
                name = form.cleaned_data.get('name')
                url = form.cleaned_data.get('url')
                # 将数据保存到数据库或其他地方
            return redirect('link_list')
    else:
        formset = LinkFormSet()
    return render(request, 'add_links.html', {'formset': formset})

在上面的示例中,我们使用 LinkForm 类定义了一个基础表单类,它有两个字段:nameurl。然后,我们使用 formset_factory 函数创建了一个名为 LinkFormSet 的表单集合类,该表单集合包含了 LinkForm 类的 3 个实例。

在视图函数 add_links 中,我们通过判断请求的方法来决定是显示空的表单集合,还是提交用户提交的表单数据。如果请求方法是 POST,我们先对表单集合进行验证,如果验证通过,就循环处理每个表单实例的数据,将其保存到数据库或其他地方,最后跳转到链接列表页面。如果请求方法是 GET,我们只需要创建一个空的表单集合即可,并在渲染页面时将其传递给模板。

在模板中,我们可以使用以下方式来渲染表单集合:

<form method="POST">
  {% csrf_token %}
  {{ formset.management_form }}
  {% for form in formset %}
    {{ form.as_p }}
  {% endfor %}
  <button type="submit">提交</button>
</form>

在上面的模板中,我们利用 Django 表单集合提供的 management_form 属性,生成了一个包含表单集合信息的隐藏 input,用于在表单提交时传递必要的额外信息。然后,我们遍历表单集合中的每个表单实例,调用 as_p 方法将其转换成 HTML 的 <p> 元素,并将其渲染到页面上。

当用户提交表单时, Django 会根据提交的信息自动创建一个合适的表单集合实例,我们只需要对其进行验证,并处理其中每个表单实例的数据即可。这让我们在构建需要添加多个类似数据的页面时,能够更加方便和高效地处理用户提交的数据。

相关文章