我们以前接触过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