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

  • 相关阅读:
    DGA域名可以是色情网站域名
    使用cloudflare加速你的网站隐藏你的网站IP
    167. Two Sum II
    leetcode 563. Binary Tree Tilt
    python 多线程
    leetcode 404. Sum of Left Leaves
    leetcode 100. Same Tree
    leetcode 383. Ransom Note
    leetcode 122. Best Time to Buy and Sell Stock II
    天津Uber优步司机奖励政策(12月28日到12月29日)
  • 原文地址:https://www.cnblogs.com/aaaajayheng1990/p/11163574.html
Copyright © 2020-2023  润新知