formset和modelformset

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进行判断?

原文地址:https://www.cnblogs.com/aaaajayheng1990/p/11163574.html