先来回顾下form的用法
一对多关系,form显示的是下拉框
多对多关系,form显示的是多选框
modelform的用法
modelsform的写法
from django.forms import ModelForm from django.forms import widgets from rbac import models class 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 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, initial-scale=1"> 7 <title>Title</title> 8 </head> 9 <body> 10 <form method="post" novalidate> 11 {% csrf_token %} 12 {{ form.as_p }} # 将他们渲染在p标签里,as_ul渲染li标签里,as_table渲染tr标签里 13 <input type="submit" value="提交"> 14 </form> 15 </body> 16 </html>
补充
可以针对字段,在前端页面显示
field 是input 框
field lable 是标题名字
field error.0 错误信息