• MdelForm 和formset


    我们以前接触过Form组件就是堆你的字段进行校验的  现在我来看看ModelForm

    ModelForm比你的Form方便了一万倍

    from django import forms

    生成form类

    class RoleForms(forms.ModelForm):
        class Meta:
            model = models.Role   #  选择要对你的哪个表进行操作
            fields = "__all__"  # 选择字段
            widgets = {  # 给你的表中的字段增加属性
                "title":forms.TextInput(attrs = {"class":"form-control"}),  # 对你的字段进行设定
    
            }
            error_messages = {  # 添加额外的信息
                "name" : {
                    "required":"用户名不能为空"
                }
            }
    def roles_edit(request,pk,*args,**kwargs):
        role_obj = models.Role.objects.filter(pk = pk).first()
        if request.method == "GET":
            form = RoleForms(instance=role_obj)    #实例化你的form类  如果有参数就用到instance 没有则不传递
            
        else:
            form = RoleForms(request.POST,instance=role_obj)
            if form.is_valid():  # 和form一样完成之后执行这个
                form.save()  # 同form组件
    
            return redirect("/rbac/role_list/")
    
    
        return render(request,"rbac/roles_add.html",{"form":form})

    modelForm也可以定义钩子函数就和form组件的定义一样的

    class MultiPermissionForm(forms.Form):
        id = forms.IntegerField(
            widget=forms.HiddenInput(),
            required=False
        )
        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')
    
        def clean_pid_id(self):  #定义全局钩子
            menu = self.cleaned_data.get('menu_id')
            pid = self.cleaned_data.get('pid_id')
            if menu and pid:
                raise forms.ValidationError('菜单和根权限同时只能选择一个')
            return pid

    formset

    以前我们使用的form表单只能一个个的在提交信息什么的 ,现在我们可以在后台使用formset然后动态生成自己想要的多行信息

    先导入信息:

    from django.forms import formset_factory

    当你的后台想要的table表格可以随着你的设定而增加,而不用再后台一个一个输入

    def multi_permissions(request):
        """
        批量操作权限
        :param request:
        :return:
        """
        post_type = request.GET.get('type')
    
        MultiPermissionFormSet = formset_factory(MultiPermissionForm, extra=0)   实例化你的formset_factory 然后把你的定义的modelForm的类传递进去
        generate_formset = None
        update_formset = None
    
        if request.method == 'POST' and post_type == 'generate':
            formset = MultiPermissionFormSet(request.POST)    # 然后对你的formset对象再次进行请求类型的判断
            if not formset.is_valid():
                generate_formset = formset
            else:
                for row_dict in formset.cleaned_data: 如果不是正确的
                    row_dict.pop('id')
                    models.Permission.objects.create(**row_dict)
    
        if request.method == 'POST' and post_type == 'update':
            formset = MultiPermissionFormSet(request.POST)
            if formset.is_valid():
                for row_dict in formset.cleaned_data:
                    permission_id = row_dict.pop('id')
                    models.Permission.objects.filter(id=permission_id).update(**row_dict)
            else:
                update_formset = formset
  • 相关阅读:
    redis网络资料汇总
    Spring攻略学习笔记(3.01)在Spring中启用AspectJ注解支持
    [C/C++]福尔摩斯 ABCDE*?=EDCBA
    MyBatis测试范例
    使用TileMap制作游戏地图,在cocos2dx中使用(一)
    Tomcat7 catalina.out 日志分割
    MyBatis之User.xml
    基于 SIP webRTC 架构的系统部署模型分析
    第42周星期二
    第41周星期三小结
  • 原文地址:https://www.cnblogs.com/zhaoyunlong/p/9526134.html
Copyright © 2020-2023  润新知