zoukankan      html  css  js  c++  java
  • 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进行判断?

  • 相关阅读:
    Android Handler研究(1)
    知识树杂谈Java面试(4)
    BAT级别分类
    知识树杂谈Android面试(3)
    知识树杂谈(2)
    mac iterm2安装、sshpass密码记住
    一万小时定律
    第17章(下)--集合
    第17章(中)--集合
    第17章(上)--集合
  • 原文地址:https://www.cnblogs.com/aaaajayheng1990/p/11163574.html
Copyright © 2011-2022 走看看