django的forms认证组件

每个网站的注册界面都需要有相应的“认证”功能,比如说认证注册页面的用户名是否已被注册,二次输入的密码是否一致以及认证用户输入的用户名、邮箱、手机号等字段是否符合程序员所指定的“规则”等等。当然,不同的web框架有不同的实现方式,本文介绍django的forms组件的实现方法。

默认的校验规则

默认的校验规则都是校验单个字段而且格式是固定的:

建表

models.py文件为数据库中创建下面字段:
from django.db import models
class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    pwd = models.CharField(max_length=32)
    email = models.EmailField()
    tel = models.CharField(max_length=32)

模板文件

模板文件我们引用bootstrap,并且利用模板语言进行渲染得到相应的页面:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Forms组件</title>
    <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.css">
    <link rel="stylesheet" href="/static/whw_css.css">
</head>
<body>
<h3>注册页面</h3>
<div class="container">
    <div class="row">
        <div class="col-md-6 col-lg-offset-3">
           <form action="" method="post" novalidate >
            {% csrf_token %}
            <p>用户名 {{ form.name }}<span class="pull-right">{{ form.name.errors.0 }}</span></p>
            <p>密码 {{ form.pwd }}<span class="pull-right">{{ form.pwd.errors.0 }}</span></p>
            <p>确认密码 {{ form.r_pwd }}<span class="pull-right">{{ form.r_pwd.errors.0 }}</span><span class="pull-right">{{ full_errors.0 }}</span></p>
            <p>邮箱 {{ form.email }}<span class="pull-right">{{ form.email.errors.0 }}</span></p>
            <p>手机号 {{ form.tel }}<span class="pull-right">{{ form.tel.errors.0 }}</span></p>
            <input type="submit" value="确认">
        </form>
        </div>
    </div>
</div>
</body>
</html> 

校验模块

为了使程序易于维护且解耦性高一点,我们把认证功能写在一个模块my_forms.py里,在里面定义一个专门用于认证的类UserForm:
#先引入相应的模块
from django import forms
from django.forms import widgets
from app01.models import UserInfo
from django.core.exceptions import NON_FIELD_ERRORS,ValidationError

#做校验的类,后面跟着校验规则
class UserForm(forms.Form):
    ##校验字段
    name = forms.CharField(min_length=4,label='用户名',widget=widgets.TextInput(attrs={'class':'form-control'}),error_messages={'required':'输入不能为空'})

    email = forms.EmailField(label='邮箱',widget=widgets.TextInput(attrs={'class':'form-control'}),error_messages={'required':'输入不能为空','invalid':'请输入邮箱格式'})

    pwd = forms.CharField(min_length=4,label='密码',widget=widgets.PasswordInput(attrs={'class':'form-control'}),error_messages={'required':'输入不能为空'})

    r_pwd = forms.CharField(min_length=4,label='确认密码',widget=widgets.PasswordInput(attrs={'class':'form-control'}),error_messages={'required':'输入不能为空'})

    tel = forms.CharField(label='手机号',widget=widgets.TextInput(attrs={'class':'form-control'}),error_messages={'required':'输入不能为空'})
参数说明:
(1)min_length=4表示输入的字符的长度不能小于4
(2)widget=widgets.TextInput(attrs={'class':'form-control'}) 这句话表示输入框input的type='text',且class='form-control'
(3)error_messages是在用户输入不符合校验规则时做出的说明,是一个字典的形式。注意字典里的key值是固定的!

视图函数

views.py文件的内容如下:
from django.shortcuts import render,HttpResponse
##引入校验的类
from app01.my_forms import UserForm

#视图函数
def my_forms(request):
    if request.method == 'GET':
        form = UserForm()
        return render(request, 'index.html',{'form':form})

    if request.method == 'POST':
        #form表单的name属性值应当与forms组件的字段名称一致
        form = UserForm(request.POST)
        print(form.is_valid())
        if form.is_valid():
            print(form.cleaned_data)
            #只有全部验证成功了才执行
            return HttpResponse('OK!')
        else:
            print(form.errors)
            #带着参数返回当前页面
            return render(request,'index.html',locals())
如上面的代码所示,我们用UserForm类以及前端返回的参数实例化出一个类form:
form = UserForm(request.POST)
这里有一个is_valid()方法,返回布尔类型的值。只有当全部字段校验成功后它的值才为True。
最终校验成功的字段存到了form.cleaned_data里;校验失败的字段以及对应的错误信息放在了form.errors里。将这两个“字典”类型的数据传给模板我们就可以看到对应的信息了:

自定义校验规则与多个字段的校验

一、自定义校验规则我们用到局部钩子。如果我们想校验属性name,那么可以在UserForm类中我们定义一个方法,名字固定为clean_name
##校验数据库中是否有相同的用户名
def clean_name(self):
    val = self.cleaned_data.get('name')
    #数据库中检测
    ret = UserInfo.objects.filter(name=val)
    if not ret:
        return val
    #如果ret有值表示数据库中有这条记录了
    else:
        raise ValidationError('该用户已注册')

注意这个方法名固定,必须是clean_%s的形式,这里的%s就是校验的属性的名字。比如说我们想校验手机号必须为11位可以这样写:
def clean_tel(self):
    val = self.cleaned_data.get('tel')
    if len(val) == 11:
        return val
    else:
        raise ValidationError('手机号必须为11位')

二、进行多个字段的校验我们用到全局钩子
如果我们想校验两次收入的密码是否一致可以在UserForm中定义一个方法clean:
def clean(self):
    pwd = self.cleaned_data.get('pwd')
    r_pwd = self.cleaned_data.get('r_pwd')
    if pwd and r_pwd:
        if pwd == r_pwd:
            return self.cleaned_data
        else:
            raise ValidationError('两次密码不一致')
    else:
        return self.cleaned_data

django的forms认证组件的更多相关文章

  1. python 全栈开发,Day79(Django的用户认证组件,分页器)

    一.Django的用户认证组件 用户认证 auth模块 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中: 如果用户存在于数据库中,然后再验证用户 ...

  2. django - 总结 - 用户认证组件

    用户认证组件 from django.contrib import auth 从auth_user表中获取对象,没有返回None,其中密码为密文,使用了加密算法 user = auth.authent ...

  3. Django的rest_framework认证组件之全局设置源码解析

    前言: 在我的上一篇博客我介绍了一下单独为某条url设置认证,但是如果我们想对所有的url设置认证,该怎么做呢?我们这篇博客就是给大家介绍一下在Rest_framework中如何实现全局的设置认证组件 ...

  4. Django的rest_framework认证组件之局部设置源码解析

    前言: Django的rest_framework组件的功能很强大,今天来我来给大家剖析一下认证组件 下面进入正文分析,我们从视图开始,一步一步来剖析认证组件 1.进入urls文件 url(r'^lo ...

  5. django的用户认证组件

    DataSource:https://www.cnblogs.com/yuanchenqi/articles/9064397.html 代码总结: 用户认证组件: 功能:用session记录登录验证状 ...

  6. 06 django的用户认证组件

    1.用户认证组件 用户认证组件: 功能:用session记录登录验证状态 前提:用户表:django自带的auth_user 创建超级用户: python3 manage.py createsuper ...

  7. Django的用户认证组件,自定义分页

    一.用户认证组件 1.auth模块 from django.conrtrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1)authen ...

  8. Django之REST_FRAMEWORK 认证组件

    Django之DRF之认证组件 # from rest_framework.views import APIView # APIView 中的 dispatch 中 执行的 self.initial( ...

  9. Django REST framework —— 认证组件源码分析

    我在前面的博客里已经讲过了,我们一般编写API的时候用的方式 class CoursesView(ViewSetMixin,APIView): pass 这种方式的有点是,灵活性比较大,可以根据自己的 ...

随机推荐

  1. 为iframe添加onclick事件

    如果页面上有iframe时,鼠标点击在iframe内时,包含iframe的document是不响应任何事件的, 例如: $("#iframe1").click(function() ...

  2. Win10下安装zio

    0x00 报错:capstone.dll缺失,就算用pip安装也不行. 推荐:kali下安装pwn,pwntools,zio

  3. oracle数据库连接 ORA-12638:身份证明检索失败

    连数据库的时候突然报了一个这个 查找各种办法,发现自己从10g换成了11g,不过这个没有什么关系,跟oracle的安全设置有关系, 首先从开始菜单找到Net Manager 打开,选择本地,概要文件, ...

  4. Python随笔--函数(参数)

    函数文档: 关键字参数: 默认参数:定义了默认值的参数 收集参数(可变参数):

  5. 事务理解及Spring中的事务

    一.隔离级别理解 1.脏读 首先理解,一个事务对数据进行了改变,尽管该事务尚未提交,但此时其他事务中的查询语句(注意一定是处于事务中的语句,不处于事务中的语句查到的是正常的)查到的数据,是该事务修改之 ...

  6. sql整体优化的五种工具

    1.AWR报告 1.1 awr是什么? 它是关注于数据库整体性能状况,类比于我们去医院看病的体检报告,只是用一些指标对数据库做了一个判断. 1.2awr怎么获取 awr报告的获取有两种方式: 一.直接 ...

  7. 在电脑中配置SQLServer数据源

    要想其他软件(R.python等)能连接SQLServer数据库,必须在这些软件所在点电脑下配置相应的数据源(ODBC).我的电脑是在Windows下的,配置步骤如下: 1.控制面板-----> ...

  8. Linux:挂载、卸载光盘

    挂载.卸载光盘 前提准备: 已经安装好虚拟机 安装好的虚拟机与镜像系统最好一致 前提配置 1.选择虚拟机 2.选择设置 3.选择CD/DVD 4.选择ISO镜像文件,选择设备状态,都勾选 5.ps如果 ...

  9. 10--Python入门--异常处理

    在程序编写过程中,难免会有一些错误.python中有一些语句可以处理这些异常或者错误,使得程序能够运行,且识别到错误的位置 try..except函数,java中是try catch 在下面的例子中, ...

  10. tofile和fromfile数组内建函数

    numpy教程:基本输入输出和文件输入输出Input and output 使用数组的方法函数tofile可以方便地将数组中数据以二进制的格式写进文件.tofile输出的数据没有格式,因此用numpy ...