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,我们可以方便地处理和验证表单集合的数据,并在后端进行保存。这提供了一个简单而强大的方式来管理多对多关系的数据。
