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

时间: 2024-10-05 21:32:41

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

thinkphp5.0自定义验证器

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

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

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

自定义验证器

自定义验证器必须实现 Validator 接口. ValidatorSupport 和 FieldValidatorSupport 实现了 Validator 接口 --若需要普通的验证程序, 可以继承 ValidatorSupport 类 --若需要字段验证程序, 可以继承 FieldValidatorSupport 类 --若验证程序需要接受一个输入参数, 需要为这个参数增加一个相应的属性 注册验证程序: 自定义验证器需要在类路径里的某个 validators.xml 文件里注册:  验证框

angular自定义验证器添加入模板驱动表单

创建自定义验证器的命令 ng generate directive forbidden-name(自定义床啊金验证器的名称) 生成的文件内容 import { Directive } from '@angular/core'; @Directive({ selector: '[appForbiddenName]' }) export class ForbiddenNameDirective { constructor() { } } 创建一个文件用来放置正则判断的验证器算法.validatot.

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

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

枚举帮助方法,枚举数据注解自定义验证器

枚举辅助类 获取枚举项列表 获取枚举值列表 枚举项包含 枚举值包含 转换枚举 代码如下 1 /// <summary> 2 /// 枚举辅助类 3 /// </summary> 4 public class EnumHelper 5 { 6 7 private static readonly Dictionary<Type, object> EnumCache = new Dictionary<Type, object>(); 8 9 private sta

如果自定义模板验证器有同名的输入属性时,各验证器的行为是什么

最近由于工作需要,使用了自定义模板验证器.其中有两个自定义验证器分别定义了一个同名的输入属性,导致两个验证器的验证逻辑出现了问题.经过实验,自己总结问题的原因和同名输入属性的适用规则如下. 1 同名输入属性根据DOM的顺序适用于所有包含该名输入属性的所有验证器. 假设两个自定义验证器custom1和custom2,都包含prop输入属性. <input ngModel text='test' name='age' custom1 [prop]='"abc"' custom2 [p

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 在一定程度上