form表单最大的作用就是验证功能了,通过cleaned_data清洗,我们可以获取传来的值,通过参数、验证器、自定义验证方法,我们可以做到很多的验证。

验证器可用于在不同类型的字段之间重用验证逻辑。validators有自带的验证器,也可以自己定义一个验证器。在验证某个字段的时候,可以传递一个validators参数用来指定验证器,进一步对数据进行过滤。验证器有很多,但是很多验证器其实已经通过这个Field或者一些参数就可以指定了。比如EmailValidator,可以通过EmailField来指定,比如MaxValueValidator,可以通过max_value参数来指定。以下是一些常用的验证器:

from django.core import validators
  1. MaxValueValidator:验证最大值。
  2. MinValueValidator:验证最小值。
  3. MinLengthValidator:验证最小长度。
  4. MaxLengthValidator:验证最大长度。
  5. EmailValidator:验证是否是邮箱格式。
  6. URLValidator:验证是否是URL格式。
  7. RegexValidator:如果还需要更加复杂的验证,那么可以通过正则表达式的验证器

其中最常用到的就是RegexValidator,他可以通过正则自己定义验证器。如下面自己定义的一个验证手机号的例子。自定义验证器后,将验证器加入到validators的列表中。

# 创建手机号的正则校验器
mobile_validator = RegexValidator(r"^1[3-9]\d{9}$", "手机号码格式不正确")
 mobile = forms.CharField(max_length=11, min_length=11, validators=[mobile_validator, ],
error_messages={"min_length": "手机号长度有误", "max_length": "手机号长度有误",
"required": "手机号不能为空"})

自定义验证

对于一些字段,可能还有一些更复杂的验证,我们可以采用函数的形式,构造自定义验证。一种是针对一个字段的验证,函数名为clean_字段名(self),还有一种是针对多个字段一起验证,函数名为clean(self),clean方法的第一步需要重新调用父类的clean方法。这两种方式,如果验证失败,那么就抛出一个验证错误ValidationError 。

# 验证手机号
if (not real_image_code) or (image_text != real_image_code):
raise forms.ValidationError("图片验证失败")
from django import forms

class ContactForm(forms.Form):
# Everything as before.
... def clean_recipients(self):
data = self.cleaned_data['recipients']
if "fred@example.com" not in data:
raise forms.ValidationError("You have forgotten about Fred!") # Always return a value to use as the new cleaned data, even if
# this method didn't change it.
return data
from django import forms

class RegisterTable(forms.Form):
username = forms.CharField(min_length=1,max_length=10)
phone = forms.CharField(validators=[validators.RegexValidator("1[345678]\d{9}", message="请输入正确的手机号码")]) # message会在表单类.errors.get_json_data()中获得 # 对某个字段进行自定义的验证方式是,定义一个方法,这个方法的名字定义规则是:clean_fieldname
def clean_phone(self):
phone = self.cleaned_data.get("phone") # 获得字段数据
ret = User.objects.filter(phone=phone).exists() # 如果已存在
if ret:
raise forms.ValidationError(message="{}已经被注册".format(phone)) # 抛出异常
# message会在表单类.errors.get_json_data()中获得
else:
return phone

下面是clean方法:

class RegisterTable(forms.Form):
username = forms.CharField(min_length=1,max_length=10)
phone = forms.CharField(validators=[validators.RegexValidator("1[345678]\d{9}", message="请输入正确的手机号码")])
pwd = forms.CharField(min_length=5) #密码
pwd_repeat = forms.CharField(min_length=5) #重复的密码 def clean_phone(self):
phone = self.cleaned_data.get("phone")
ret = User.objects.filter(phone=phone).exists()
if ret:
raise forms.ValidationError(message="{}已经被注册".format(phone))
return phone def clean(self): #最后审查
ret = super(RegisterTable, self).clean()
pwd = ret.get("pwd") # ==self.cleaned_data.get("pwd")
pwd_repeat = ret.get("pwd_repeat")
if pwd != pwd_repeat:
raise forms.ValidationError(message="密码不一致")
else:
return ret

form——验证器Validators的更多相关文章

  1. struts2 基础4 验证器、 国际化

    验证器: 验证器:用户输入验证 1.手动编程方式 )对于动作类中所有方法进行验证 a.动作类继承ActionSuport b.覆盖调用public void validate(){} 方法 c.在va ...

  2. TP6.0中的密码验证逻辑、验证器的使用

    目录 1. 场景一:只有一个密码框,并且是可选项,留空不修改密码,不留空则修改密码 2. 场景二:两个密码框,修改密码时有新密码.确认密码,新密码框不为空时,确认密码才验证 1. 场景一:只有一个密码 ...

  3. Angular:Reactive Form的使用方法和自定义验证器

    本文将介绍Angular(Angular2+)中Reactive Form的有关内容,包括: Reactive Form创建方法 如何使用验证 自定义验证器 下面开始进入正文! Reactive Fo ...

  4. 原生JS 表单提交验证器

    转载:http://www.cnblogs.com/sicd/p/4613628.html 一.前言 最近在开发一个新项目,需要做登陆等一系列的表单提交页面.在经过“缜密”的讨论后,我们决定 不用外部 ...

  5. JS表单原生验证器

    一.前言 最近在开发一个新项目,需要做登陆等一系列的表单提交页面.在经过“缜密”的讨论后,我们决定 不用外部流行的框架,如bootstrap,由于我负责的模块 仅仅是其中的一部分,因此少数服从多数,无 ...

  6. Struts(二十五):自定义验证器

    编程验证 Struts2提供了一个Validateable接口,可以使用Action类实现这个接口以提供编程验证: ActionSupport类已经实现了Validateable接口. public ...

  7. flask 自定义验证器(行内验证器、全局验证器)

    自定义验证器 在WTForms中,验证器是指在定义字段时传入validators参数列表的可调用对象,下面来看下编写自定义验证器. 行内验证器 除了使用WTForms提供的验证器来验证表单字段,我们还 ...

  8. Flask系列09--Flask中WTForms插件,及自定义验证器

    一.概述 django中的forms组件非常的方便,在flask中有WTForms的组件实现的也是类似的功能, 安装这个插件 二.简单使用 文档地址https://wtforms.readthedoc ...

  9. (翻译)Angular 1.3中的验证器管道

    原文地址:VALIDATORS PIPELINE IN ANGULAR 1.3 我们知道在Angular中操作表单是很爽的.因为Angular本身的作用域模型,我们总能在相应的作用域中获取到表单当前的 ...

随机推荐

  1. RIOT笔记

    RIOT笔记 2016-04-25 [资源] 维基 https://github.com/RIOT-OS/RIOT/wiki 代码 https://github.com/RIOT-OS/RIOT 网页 ...

  2. liunx mysql 5.7 二进制安装

    liunx 5.6版本 本人安装次数不下20次,基本上按照正常的操作流程不会出现什么问题,一切顺利. 今天开发新项目需要按照mysql 5.7 版本.mysql 5.7版本和mysql 5.6版本变化 ...

  3. java#StringBuffer&StringBuilder

    StringBuffer A thread-safe, mutable sequence of characters. A string buffer is like a String, but ca ...

  4. HDU - 6181 Two Paths(次短路)

    题意:求次短路. 分析:关键是情况讨论. LL tmpd = x.d + e.dist; 以下情况对应的更新结果 1.tmpd(2) < 最短路(3) < 次短路(4)-------> ...

  5. JPA#ManyToMany

    多对多,多个学生选了多个课程. 涉及到的注解(注解的使用看注释):ManyToManyJoinTableJsonIgnoreProperties @Entity @Table(name = " ...

  6. mysql怎么查看当前登录用户

    mysql> select user();+----------------+| user()         |+----------------+| root@localhost |+--- ...

  7. 开源DDD设计模式框架YMNNetCoreFrameWork第三篇-增加ASp.net core Identity身份认证,JWT身份认证

    1.框架增加Identity注册功能 2.框架增加identity登录以后获取JWTtoken 3.请求接口通过token请求,增加验证特性 源代码地址:https://github.com/topg ...

  8. Bug 佛祖镇楼

    原文链接:https://www.cnblogs.com/xdp-gacl/p/4198935.html // _ooOoo_ // o8888888o // 88" . "88 ...

  9. 089-PHP数组运用 - 通过循环函数取出部分成员合并成新数组

    <?php function myfunc($arr){ //定义过滤函数 $j=count($arr); for($i=0;$i<$j;$i++){ if($arr[$i]>=0& ...

  10. 第二阶段scrum-7

    1.整个团队的任务量: 2.任务看板: 会议照片: 产品状态: 部署云服务器完成,链接数据库完成,消息收发正在制作.