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
原文地址:https://www.cnblogs.com/zhaoyunlong/p/9526134.html