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验证的代码:

 

posted @ 2018-04-23 16:52  帅丶高高  阅读(200)  评论(0编辑  收藏  举报