欢迎访问宙启技术站
智能推送

Django.formsBaseFormSet():使用表单集保存多对多关系数据

发布时间:2024-01-04 17:01:26

Django提供了一种名为BaseFormSet的类,用于处理表单集合。表单集合是指一组相似的表单(例如,具有相同字段的表单),并且使用单个表单提交多个数据。

BaseFormSet提供了一些方法和属性,用于管理表单集合中的多个表单和验证数据。它是所有表单集合的基础类,可以通过继承和定制来满足特定需求。

下面是一个使用BaseFormSet保存多对多关系数据的例子。假设我们有两个模型,一个是"Person"表示人物,另一个是"Skill"表示技能。每个人可以有多个技能,每个技能也可以属于多个人。

首先,我们需要定义两个模型:

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name

class Skill(models.Model):
    name = models.CharField(max_length=50)
    persons = models.ManyToManyField(Person, related_name='skills')

    def __str__(self):
        return self.name

接下来,我们创建一个表单类,用于对技能进行编辑。我们使用了ModelMultipleChoiceField字段,它会自动从数据库中加载技能选项。

from django import forms
from .models import Skill

class SkillForm(forms.Form):
    skills = forms.ModelMultipleChoiceField(queryset=Skill.objects.all())

接下来,我们可以使用BaseFormSet创建一个表单集合,以便在同一页面中编辑多个人的技能。

from django.forms import BaseFormSet

class SkillFormSet(BaseFormSet):
    form = SkillForm

现在我们可以使用这个表单集合在视图中处理提交的数据。

from django.shortcuts import render
from .forms import SkillFormSet

def edit_skills(request):
    # 获取所有人物
    persons = Person.objects.all()

    if request.method == 'POST':
        formset = SkillFormSet(request.POST)

        if formset.is_valid():
            for form in formset:
                # 获取已选择的技能列表
                selected_skills = form.cleaned_data['skills']
                
                # 保存技能到数据库中
                for skill in selected_skills:
                    skill.persons.add(form.person)

            return render(request, 'success.html')
    else:
        formset = SkillFormSet()

    return render(request, 'edit_skills.html', {'formset': formset, 'persons': persons})

在模板中,我们可以使用formset来渲染表单集合的每个表单。

<form method="POST">
  {% csrf_token %}
  {% for form in formset %}
    {{ form }}
  {% endfor %}
  <button type="submit">Save</button>
</form>

这样,我们就可以在同一页面上编辑多个人的技能,并将其保存到数据库中。每个表单对应一个人,可以选择多个技能。

通过使用BaseFormSet,我们可以方便地处理和验证表单集合的数据,并在后端进行保存。这提供了一个简单而强大的方式来管理多对多关系的数据。