day21-Form验证
一、前言
之前验证的时候,我们都是通过在前端输入input框,然后通过form或者ajax提交的方式,提交给后台,后台拿到数据之后跟数据库中的值做比较,正确跳转到index页面,不正确的话,会给出错误提示,我们今天来学习一下django自带的form表单验证,它是怎么玩的,这个也是django自己自带的。那这个怎么去验证呐?下面我们就来研究一下吧。这边注重强调一下:Form只是做数据验证用的
二、Form验证
2.1、自定义类
说明:需要自定义验证类,这个类中的需要继承forms.Form
from django import forms from django.forms import fields from django.forms import widgets #这里面定义了所有的html的插件,什么插件都有,比如input框,checkbox,password,select 等 class FM(forms.Form): #前端标签中的name值必须要跟这边是一样的 user = fields.CharField(error_messages={"required":"用户名不能为空"},#自定义错误提示 widget=widgets.Textarea(attrs={'class':'c1','id':'username'})) #自定义插件,attrs表示标签属性 pwd = fields.CharField( max_length=12, min_length=6, #字段长度的限制 error_messages={"min_length":"长度不能小于6","max_length":"密码长度不能大于12","required":"密码不能为空"}, widget=widgets.PasswordInput ) email = fields.EmailField(error_messages={"required":"邮箱不能为空",'invalid':"邮箱格式错误"}) #用forms也可以,但是都是继承fields的
注意知识点:
1、定义的html插件
说明:我们在使用html标签的时候,需要自定义html的插件,默认是input插件
from django.forms import widgets #这里面定义了所有的html的插件,什么插件都有,比如input框,checkbox,password,select 等
插件使用,可以指定插件的属性,attrs={‘class’,'c1'....}
user = fields.CharField(widget=widgets.Textarea(attrs={'class':'c1','id':'username'})) #自定义插件,attrs表示标签属性
2、fields类
所有的Field都是继承 fields类 比如EmailField、CharField等等,都是的,所以需要导入fields类,当然你用forms也是可以的,但是最好还是用fields这个
from django import forms from django.forms import fields class FM(forms.Form): #这边的属性,必须要跟前端的标签的name属性的值一样 user = fields.CharField() pwd = fields.CharField() email = fields.EmailField()
3、验证参数
我们可以自定义输入框的验证参数,所有的错误信息都在error_message里面这个参数里面,这个参数的错误提示类型,我们上面也看到了,required,或者 invalid,等等
email = fields.EmailField(error_messages={"required":"邮箱不能为空",'invalid':"邮箱格式错误"})
2.2、引用验证信息
说明:既然我们已经制定好了验证规则,那我们就需要引用这些验证规则,所以我们这边定义了一个fm的函数,然后使用这个验证机制
def fm(request): if request.method == "GET": obj = FM() #这边的obj对象名需要跟下面的一样 return render(request,'fm.html',{"obj":obj}) elif request.method == "POST": # 获取用户的所有数据 # 每条数据请求的验证 # 成功: 获取所有的正确的信息 # 失败: 显示错误信息 obj = FM(request.POST) #因为这次提交的时post里面的数据 r1 = obj.is_valid() #去验证,验证是否成功,成功返回True,失败返回False if r1: from app01 import models print(obj.cleaned_data) #返回的正确信息 models.User.objects.create(**obj.cleaned_data) #注册功能就算实现了 else: print(obj.errors) #表示所有的错误信息 print(obj.errors.get("pwd")[0]) #这个是user的错误信息,继承了ErrorDict,所以需要通过字典的方式的去拿值,这边错误提示有很多个,我们一般拿第0个错误 # print(obj.errors.as_json) #以json格式形式输出所有的错误信息 return render(request,'fm.html',{'obj':obj})
注意知识点:
1、使用form的验证机制
需要在get请求和post请求都需要创建一个相同的对象,这个目的是为了方便前端拿到定制的插件
if request.method == "GET": obj = FM() #创建FM类的验证对象 return render(request,'fm.html',{"obj":obj}) elif request.method == "POST": obj = FM(request.POST) #因为这次提交的时post里面的数据 r1 = obj.is_valid()
2、验证之后返回信息
验证之后,如果验证成功会返回True,并且获取正确信息,否则 返回False,并且返回错误信息
r1 = obj.is_valid() #去验证,验证是否成功,成功返回True,失败返回False if r1: from app01 import models print(obj.cleaned_data) #返回的正确信息,获取所有的正确信息 models.User.objects.create(**obj.cleaned_data) #注册功能就算实现了 else: print(obj.errors) #表示所有的错误信息 print(obj.errors.get("pwd")[0]) #这个是user的错误信息,继承了ErrorDict,所以需要通过字典的方式的去拿值,这边错误提示有很多个,我们一般拿第0个错误 # print(obj.errors.as_json) #以json格式形式输出所有的错误信息 return render(request,'fm.html',{'obj':obj}) #所以我们传一个obj对象到前端,这样就能拿到我们想要的
2.3、模板编写
说明:模板中主要获取错误信息,和根据插件,自动生成一个html标签
<form action="/fm/" method="post"> {% csrf_token %} <p>{{ obj.user }}{{ obj.errors.user.0 }}</p> <p>{{ obj.pwd }}{{ obj.errors.pwd.0 }}</p> <p>{{ obj.email }}{{ obj.errors.email.0 }}</p> <input type="submit" value="提交"/> </form>
注意知识点:
1、自动创建标签
#这边自动创建标签,这边是根据你的FM类中的widget=widgets.插件名,来定制的,默认是input框 {{ obj.user }}
2、返回错误信息
#这边获取用户标签的第0个错误信息,因为错误信息可能有很多个,我们只需要拿第0个 {{ obj.errors.user.0 }}
三、其他类型的模板显示
<form action="/fm/" method="post"> {% csrf_token %} {{ obj.as_p }} #标签按照p方式排列 <input type="submit" value="提交"/> </form> #使用方式跟上面一样 <table> {{ obj.as_table }} #标签按照table方式排列 </table> {{ obj.as_ul }} #标签按照ul的方式排列
这个效果图我就不一个一个展示了,我就拿第一展示吧,如图:
其他需要注意的是:我们应该自己在app中创建一个forms.py文件,来专门存放forms验证的代码: