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. CC26XX开发

    [CC26XX开发] 2016-01-26 [CC2650 入门] CC2650 sensortag入门 http://processors.wiki.ti.com/index.php/CC2650_ ...

  2. PAN3501与AS3933完美兼容替代

    现在不少校园门禁卡都是采用奥地利的AS3933,市场需求是供不应求,当然价格上还是不断上升趋势.成本上压力也是越来越大,不少厂家在寻找能替代软硬件兼容AS3933的芯片方案.今天我就为大家介绍一款能否 ...

  3. vscode dart 插件 关闭自动注释

    vscode dart 插件 关闭自动注释 左下角设置 --> 搜索 Closing Labels --> 去掉勾选

  4. css滚动

    css 滚动transform: translateY(-100px);jquery $(box).height(); //获取元素高度$(box).scrollTop();//获得元素的滚动条高度

  5. Service总结

    Service Service的应用场景,以及和Thread区别 开启Service的两种方式以及区别 Service基础 Service是什么? Service(服务)是一个可以在后台长时间运行而没 ...

  6. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-plus

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  7. Golang的标准命令简述

    Golang的标准命令简述 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Go本身包含了大量用于处理Go程序的命令和工具.go命令就是其中最常见的一个,它有许多子命令,接下来就跟随 ...

  8. mysql 免安装版密码操作

    登录MySQL:mysql -u root -p 1.修改用户密码: mysql> GRANT ALL ON . TO ‘root’@’localhost’ IDENTIFIED BY ‘123 ...

  9. spring的一些annotation

    通过使用spring的注解可以把一些类通过spring容器管理这些类 @controller 控制器(注入服务) @service 服务(注入dao) @repository dao(实现dao访问) ...

  10. Go语言 一维数组的使用

    程序源码 package main import ( "fmt" // 导入 fmt 包,打印字符串是需要用到 ) func main() { // 声明 main 主函数 var ...