modelform实例学习

先来回顾下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 错误信息
原文地址:https://www.cnblogs.com/jokerbj/p/8189815.html