先来回顾下form的用法
一对多关系,form显示的是下拉框
多对多关系,form显示的是多选框
modelform的用法
modelsform的写法
from django.forms import ModelFormfrom django.forms import widgetsfrom rbac import modelsclass Userform(ModelForm): class Meta: model = models.User fields = ['username','password'] error_messages = { 'username':{ 'required':'名称不能为空','invalid':'格式错误'}, 'password':{ 'required':'名称不能为空','invalid':'格式错误'} } widgets = { 'username':widgets.TextInput(attrs={ 'class':'form-control','placeholder':'username'}), 'password':widgets.TextInput(attrs={ 'class':'form-control','placeholder':'password'}) }
视图的验证
52 53 # ============================================================ 54 55 # 类型首页 56 def user_type(request): 57 user_type_list = models.UserType.objects.all() 58 return render(request,'user_type.html',{ 'user_type_list':user_type_list}) 59 60 61 # 添加编辑类型 62 class UserTypeModeForm(ModelForm): # 用户类型规则 63 title = fields.CharField(max_length=6,required=True,widget=wd.Textarea()) # 如果Meta里面没有这个字段,就是添加一个,如果有就是覆盖Meta里面相同字段样式 64 65 class Meta: 66 model = models.UserType # 用户类型表 67 fields = "__all__" # 所有字段 68 69 error_messages = { # 错误信息 70 'title':{ 'required':'名称不能为空','invalid':'格式错误'} 71 } 72 widgets = { # 插件渲染,因为与导入widgets重名,所以导入的时候as设置了别名 73 'title':wd.TextInput(attrs={ 'class':'c1'}) 74 } 75 76 # 钩子函数,同form 77 78 79 def user_type_add(request): # 用户类型添加,因为多对多关系,会渲染出来多选框,一对多渲染出下拉框,前端注意是form.字段没有id,因为你是从models引入来的,没有id 80 if request.method == "GET": 81 form = UserTypeModeForm() # get无数据渲染 82 return render(request,'user_type_add.html',{ 'form':form}) 83 else: 84 form = UserTypeModeForm(request.POST) 85 if form.is_valid(): # 验证通过 86 form.save() # 保存到数据库 87 return redirect('/usertype/') 88 else: 89 return render(request, 'user_type_add.html', { 'form': form}) # 没通过验渲染错误 90 91 92 def user_type_edit(request,nid): # 编辑类型 93 obj = models.UserType.objects.filter(id=nid).first() 94 if not obj: 95 return HttpResponse('...') 96 97 if request.method == 'GET': 98 # 显示默认值 99 form = UserTypeModeForm(instance=obj) # 传递默认参数,页面就会显示默认的值100 return render(request,'user_type_edit.html',{ 'form':form})101 else:102 form = UserTypeModeForm(instance=obj,data=request.POST) #### 更新的功能103 if form.is_valid():104 form.save()105 return redirect('/usertype/')106 else:107 return render(request, 'user_type_edit.html', { 'form': form})
前端页面
1 2 3 4 5 6 715 16Title 8 9 10
补充
可以针对字段,在前端页面显示field 是input 框field lable 是标题名字field error.0 错误信息