• Django formset


    一 什么是formset

    Form组件或ModelForm用于做一个表单验证而formset是用于做多个表单的验证组件,用于做批量操作

    二 formset的使用方法

    1 设置form信息

    class MultiAddPermissionForm(forms.Form):
        title = forms.CharField(
            widget=forms.TextInput(attrs={'class': "form-control"})
        )
        url = forms.CharField(
            widget=forms.TextInput(attrs={'class': "form-control"})
        )
        name = 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={'class': "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.Permission.objects.filter(pid__isnull=True).exclude(
                menu__isnull=True).values_list('id', 'title')

    2 视图中实例化formset_actory并传入之前定义好Form信息

    from django.forms import formset_factory
    
    def multi_add(requeest):
        formset_class = formset_factory(MultiPermissionForm, extra=2)  # extra 表示展示几行form
        if request.method == "GET":
            formset = formset_class()
            return render(requeest, 'multi_add.html', {'formset': formset}
        formset = formset_class(data=request.POST)
        if formset.is_valid():
            print(formset.cleaned_data)
            flag = True
            post_row_list = formset.cleaned_data  # 如果formset中没有错误信息, 则将用户提交的数据获取到
            for i in range(0, formset.total_form_count()):
                row = post_row_list[i]
                if not row:
                    continue
                # 保存方式一(不推荐)
                # modes.Permission.objects.create(**row)
                # 保存方式二
                try:
                    obj = models.Permission(**row)
                    obj.validate_unique()  # 检查当前对象在数据库是否存在唯一的异常
                    obj.save()
                except Exception as e:
                    formset.errors[i].update(e)
                    flag = False
            if flag:
                return HttpResponse('提交成功')
            else:
                return render(request, 'multi_add.html', {'formset': formset}
        return render(request, 'multi_add.html', {'formset': formset}

    三 使用formset批量编辑

    class MultiEditPermissionForm(forms.Form):
        id = forms.IntegerField(
            widget=forms.HiddenInput()
        )
    
        title = forms.CharField(
            widget=forms.TextInput(attrs={'class': "form-control"})
        )
        url = forms.CharField(
            widget=forms.TextInput(attrs={'class': "form-control"})
        )
        name = 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={'class': "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.Permission.objects.filter(pid__isnull=True).exclude(
                menu__isnull=True).values_list('id', 'title')

    批量编辑

    from django.forms import formset_factory
    def multi_edit(request):
        formset_class = formset_factory(MultiEditPermissionForm, extra=0)
        if request.method == 'GET':
            formset = formset_class(
                initial=models.Permission.objects.all().values('id', 'title', 'url', 'name', 'menu_id', 'pid_id'))
            return render(request, 'multi_edit.html', {'formset': formset}
        formset = formset_class(data=request.POST)
        if formset.is_valid():
            flag = True
            post_row_list = formset.cleaned_data  # 如果formset中没有错误信息, 则将用户提交的数据获取到
            for i in range(0, formset.total_form_count()):
                row = post_row_list[i]
                if not row:
                    continue
                permission_id = row.pop('id')
                try:
                    permission_object = models.Permission.objects.fitler(id=permission_id).first()
                    for key, value in row.items():
                        setattr(permission_object, key, value)
                    permission_object.validate_unique()
                    permission_object.save()
                except Exception as e:
                    formset.errors[i].update(e)
                    flag = False
            if flag:
                return HttpResponse('提交成功')
            else:
                return render(request, 'multi_add.html', {'formset': formset}
        return render(request, 'multi_add.html', {'formset': formset}
  • 相关阅读:
    国外邮箱怎么选择?哪个企业邮箱收发国际邮件比较稳定?
    企业邮箱哪家好,什么企业邮箱安全稳定好用?
    电子邮箱客户端如何设置?POP3与IMAP协议有什么区别?
    自建企业邮箱对比外包企业邮箱,集团企业邮箱该如何选择?
    集团大企业什么邮箱,大公司申请邮箱要注意什么呢
    双十一怎么买?TOM VIP邮箱推出稀缺靓号,超值福利等你领!
    双十一企业邮箱攻略送你啦!TOM企业邮箱双十一限时4折!仅余200名额!
    企业邮箱怎么买更优惠?双11申请企业邮箱哪家价更低?
    发错邮件怎么办,误删重要邮件怎么办?TOM vip邮箱后悔药一剂,请查收~
    企业邮箱登录注册,外贸企业邮箱购买哪个好?
  • 原文地址:https://www.cnblogs.com/harryblog/p/10494811.html
Copyright © 2020-2023  润新知