formset 和 modelformset
一、引入方法
from django.forms.models import modelformset_factory
from django.forms import formset_factory
二、基本使用方法
1、创建自己的form或者modelform
自己的form:
class MultiForm(forms.Form):
title = forms.CharField(
widget=forms.TextInput(attrs={'class': 'form-control'})
)
url = forms.CharField(
widget=forms.TextInput(attrs={'class': 'form-control'})
)
code = forms.CharField(
widget=forms.TextInput(attrs={'class': 'form-control'})
)
menu_id = forms.ChoiceField(
choices=[(None, '------')],
widget=forms.Select(attrs={'class': 'form-control'}),
required=False
)
pid_id = forms.ChoiceField(
choices=[(None, '------')],
widget=forms.Select(attrs={'classs': 'form-control'}),
required=False
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['menu_id'].choices += models.Menu.objects.values_list('id', 'title')
self.fields['pid_id'].choices += models.Permissions.objects.filter(pid__isnull=True).exclude(menu__isnull=True) \
.values_list('id', 'title')
自己的ModelForm:
class StudyRecordModelForm(StarkModelForm):
class Meta:
model = models.StudyRecord
fields = ['record']
2、 实例化formset_factory或者modelformset_factory
实例化formset_factory
formset_class = formset_factory(MultiForm, extra=2)
# MultiForm为设置的form
# extra参数为一次显示多少行formset
实例化modelformset_factory
formset_class = modelformset_factory(models.StudyRecord, form=StudyRecordModelForm, extra=0)
和实例化formset_factory不同的是,modelformset的实例化还需要加上指定model, 也就是那modelform中的数据类
3、生成formset对象或modelformset对象
formset对象
formset = formset_class()
modelformset对象
studyrecord_obj = models.StudyRecord.objects.filter(course_record_id=course_record_id)
# studyrecord_obj 是一个数据库对象
formset = formset_class(queryset=studyrecord_obj)
生成modelformset对象不同的是还需要添加一个queryset参数,queryset参数为数据库对象
三、前端中注意事项
这样拿到的formset对象就类似于form对象,在前端中生成表单和在后端进行表单验证的用法都差不多,但是注意在提交formset表达的时候,除了提交表达需要添加的csrf_token,还需要添加{{ formset.management_form }} 这样才能正常提交表达。
在使用modelformset中,需要在每个form前面加上{{ form.id }}, 这样在后端验证表达的时候才能识别出是哪一个form。 他会在前端中生成一个hidden熟悉的input标签
<input type="hidden" name="form-1-id" value="3" id="id_form-1-id">
四、后端验证中注意事项
1、 如果前端没有进行任何操作之间点击提交,formset不会对数据进行验证
2、对数据的更改后如何对数据库进行更新?
3、 当form数据中有unique限制时,如何对unique进行判断?