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