121.自定义验证器

自定义验证器:

有时候我们需要从数据库中提取数据进行验证,这个时候如果还是采用已经定义好的验证器就不能够实现我们想要的功能了。比如我们在注册的时候要验证该手机号或者是邮箱之前是否已经注册过了。如果已经注册过了,就不能够再次进行注册了。这个时候我们就需要对数据库中的手机字段进行验证了。对某个字段进行验证的方式就是,定义一个方法,这个方法的名字的定义规则就是clean_fieldname.如果验证失败,那么就抛出一个错误,如果没有找到相同的手机号就正常情况下返回一个手机号,代表已经通过了验证。

(1)比如,在注册的时候我们需要输入用户名手机号,密码以及确认密码四个字段的内容,同时需要对手机号是否存在数据库中进行判断,并且对密码的长度和两次密码的是否相同进行判断。那么就可以通过以下代码实现:

==forms.py文件中定义form表单字段,并且自定义验证器,示例代码如下:==

from django import forms
from djang.core import validators
from .models import User

class RegisterForm(forms.Form):
    username = forms.CharField(max_length=100,error_messages={'invalid': '输入的username是无效的'})
    # 注意这里定义的验证器参数validators所对应的是列表,一个可以迭代的对象。
    telephone = forms.CharField(validators=[validators.RegexValidator(r"1[345678]\d{9}", message='请输入正确的手机号码')])
    pwd1 = forms.CharField(max_length=24, min_length=6, error_messages={'invalid':'您输入的密码长度不符合要求'})
    pwd2 = forms.CharField(max_length=24, min_length=6, error_messages={'invalid':'您输入的密码长度不符合要求'})

    <!--对telephone字段进行自定义验证器:验证数据库中是否已经存在当前传递过来的手机号-->
    <!--函数名定义规则:clean_fieldname-->
    def clean_telephone(self):
    <!--需要调用父类的super()方法,获取当前对象的所有参数值-->
        telephone = self.super().cleaned_data.get('telephone')
        <!--使用exists()查看数据库中与telephone是否有相同的telephone,如果有的话,抛出一个异常;如果为False的话,就返回telephone-->
        exists = User.objects.filter(telephone=telephone).exists()
        if exists:
            raise forms.ValidationError('%s您输入的手机号已经注册过了,请确定后再输入。'%telephone)
        return telephone

    <!--判断form的多个字段时,可以通过重写clean方法-->
    def clean(self):
        clean_data = super().clean()
        pwd1 = clean_data.get('pwd1')
        pwd2 = clean_data.get('pwd2')
        <!--对两次获取的密码进行对比,如果二者相同的话,就可以正确的返回clean_data;否者的话,就要抛出一个异常信息。-->
        if pwd1 != pwd2:
            raise forms.ValidationError('您两次输入的密码不相同,请确认!')
        return clean_data

==在views.py文件定义对应的类视图,示例代码如下:==

from django.views import View
from .forms import RegisterForm
from .models import User
from django.http import HttpResponse
from django.shortcuts import render

class register_view(View):

    def get(self, request):
        forms = RegisterForm()
        return render(request, 'register.html',context={'forms':forms})

    def post(self, request):
        forms = RegisterForm(request.POST)
        <!--判断定义的forms表单是否符合要求,同时在执行is_valid()判断的时候,会自动调用在forms.py文件中自定义的验证器,进行相应的判断。-->
        if forms.is_valid():
            username = forms.cleaned_data.get('username')
            telephone = forms.cleaned_data.get('telephone')
            pwd1 = forms.cleaned_data.get('pwd1')
            pwd2 = forms.cleaned_data.get('pwd2')
            User.objects.create(username=username, telephone=telephone,pwd1=pwd1, pwd2=pwd2)
            return HttpResponse('Add user successful')
        else
        <!--注意,一定要打印出forms的错误信息,否则的话,我们定义的验证器中抛出的异常就不能够显示,就达不到所想要的效果了-->
            print(forms.errors.get_json_data())
            return HttpResponse('Fail user lose')

==在models.py文件中定义相应的User模型,示例代码如下:==

from django.db import models

class User(models.Model):
    username = models.CharField(max_length=100)
    telephone = models.CharField(max_length=100,unique=True)
    pwd1 = models.CharField(max_length=24)
    pwd2 = models.CharField(max_length=24)

==在APP中的urls.py文件中进行映射:==

from django.urls import path
from .views import Addview, register_view

app_name = 'validator'

urlpatterns = [
    path('', Addview.as_view(), name='add'),
    path('register/', register_view.as_view(), name='register'),
]

==在项目的urls.py文件中进行映射,示例代码如下:==

from django.urls import path, include

urlpatterns = [
    path('front/', include('front.urls')),
    path('validator/', include('validator.urls')),
]

==在register.html中的表单定义如下:==

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="" method="post">
    <table>
        <tr>
            <td>姓名:</td>
            <td><input type="text" name="username"></td>
        </tr>
        <tr>
            <td>手机号:</td>
            <td><input type="text" name="telephone"></td>
        </tr>
        <tr>
            <td>密码:</td>
            <td><input type="password" name="pwd1"></td>
        </tr>
        <tr>
            <td>确认密码:</td>
            <td><input type="password" name="pwd2"></td>
        </tr>
        <tr>
            <td></td>
            <td><input type="submit" value="提交"></td>
        </tr>
    </table>
</form>
</body>
</html>

原文地址:https://www.cnblogs.com/guyan-2020/p/12310565.html

时间: 02-15

121.自定义验证器的相关文章

thinkphp5.0自定义验证器

虽然我早就会些php基础语法,我套过数据,自己写的控制器层,不是用的api方式,那个公司是为了锻炼我,所以才那样做的,基本上的东西都是用的框架自带的,重来自己没有去封装过这些东西,所以编程思想上,还很欠缺,所以我得先好好模仿一下别人的代码. 问题: 如何自定义验证器类,并且如何使用自定义规则; 不管是验证器,还是拦截器,过滤器,都是要先继承相应的类,只要继承了就是对应的什么验证器,拦截器...了; eg: 1.自定义验证器类 class ValidateCustom extends Valida

Struts2的输入验证(四)-自定义验证器与编程式验证

一.自定义验证器 1.实现步骤: 1)定义一个验证器的类 自定义验证器必须实现 Validator 接口,由于ValidatorSupport 和 FieldValidatorSupport 实现了 Validator 接口,因此可以继承ValidatorSupport 或 FieldValidatorSupport Ⅰ. 若需要普通的验证程序,可以继承 ValidatorSupport 类: Ⅱ. 若需要字段验证程序,可以继承 FieldValidatorSupport 类: Ⅲ. 若验证程序

自定义验证器——用Struts2框架以框架师的思维灵活做好该事情

面对的问题:自定义一个18位身份验证器,编写验证器,在validators.xml文件中进行注册.在验证配置文件中使用? 第一部分:理解Struts2中自带的验证器 第二部分:怎样通过服务器(后台),再次对前台的数据进行验证 第三部分:用Struts2来自定义验证器(问题解决方案) 第一部分:理解Struts2中自带的验证器 Struts2框架中自带的后台服务器验证分为两种:声明式验证和编程式验证 u  声明式验证(重点) ?  对哪个 Action 或 Model 的那个字段进行验证 ?  使

vue-validator(vue验证器)

官方文档:http://vuejs.github.io/vue-validator/zh-cn/index.html github项目地址:https://github.com/vuejs/vue-validator 单独使用vue-validator的方法见官方文档,本文结合vue-router使用. 安装验证器 不添加自定义验证器或者无需全局使用的公用验证器,在main.js中安装验证器,使用 CommonJS 模块规范, 需要显式的使用 Vue.use() 安装验证器组件. import

JS表单原生验证器

一.前言 最近在开发一个新项目,需要做登陆等一系列的表单提交页面.在经过“缜密”的讨论后,我们决定 不用外部流行的框架,如bootstrap,由于我负责的模块 仅仅是其中的一部分,因此少数服从多数,无奈只能抛弃bootstrap等提供的布局,样式以及验证等一些列如此方便的组件,(他们拒绝使用的原因也令人发省). 那么问题就来了. 二.设计理念 我们都知道,在抛开外部框架,仅仅用JS+css+html 去开发一个页面,是很复杂的,尤其是在没有美工,前台的情况下.其实bootstrap 在一定程度上

自定义基于XML的验证器

1 a.编写一个类,继承FieldValidatorSupport类. 2 b.在public void validate(Object object)编写你的验证逻辑 3 不符合要求的就向fieldErrors中放消息 4 String fieldName=getFieldName(); 5 String fieldValue=(String) getFieldValue(fieldName, object); 6 c.一定注册你的验证器才能使用在src底下建立validators.xml定义

Yii2 自定义独立验证器

新建一个文件: ?php /** * author : forecho <[email protected]> * createTime : 2015/7/1 14:54 * description: */ namespace common\helps; use yii\validators\Validator; class ArrayValidator extends Validator { public function validateAttribute($model, $attribu

Struts2自定义拦截器

自定义拦截器 1). 具体步骤 I. 定义一个拦截器的类 > 可以实现 Interceptor 接口 > 继承 AbstractInterceptor 抽象类 II然后在拦截器类的interceptor()方法中定义这个拦截器的功能 III. 在 struts.xml 文件配置. 1注册拦截器 <interceptors> <interceptor name="hello" class="com.atguigu.struts2.intercept

Struts2系列:(21)在Struts中自定义验证规则

1.Struts实现验证的过程 通过对Struts源代码的学习,总结一下Struts如何实现验证. 在struts-default.xml文件中,有validator和workflow两个拦截器. <interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/> <interceptor

CXF拦截器介绍及自定义拦截器实现

CXF拦截器是功能的主要实现单元,也是主要的扩展点,可以在不对核心模块进行修改的情况下,动态添加功能.当服务被调用时,会经过多个拦截器链(Interceptor Chain)处理,拦截器链在服务输入(IN)或输出(OUT)阶段实现附加功能,拦截器可以在客户端加入,也可以在服务端加入. 拦截器链的阶段: 拦截器链有多个阶段,每个阶段都有多个拦截器.拦截器在拦截器链的哪个阶段起作用,可以在拦截器的构造函数中声明. 输入拦截器链有如下几个阶段,这些阶段按照在拦截器链中的先后顺序排列. 阶段名称 阶段功