Form的is_valid校验规则及验证顺序
- 查看form下的源码了解顺序
BaseForm为基类,中间包含了is_valid校验方法
@html_safe
class BaseForm:
.........
self.is_bound = data is not None or files is not None
.......
@property
def errors(self):
"""Return an ErrorDict for the data provided for the form."""
if self._errors is None:
self.full_clean() #---------------调用校验方法
return self._errors
def is_valid(self): #--------------开始校验
"""Return True if the form has no errors, or False otherwise."""
return self.is_bound and not self.errors # ---------is_bound 中是数据和字段不能为空,否则就不校验,没问题后调用self.errors开始校验
.......
- is_valid 的校验顺序
1. obj = MyForm(request.POST) 创建将要校验的实例
2. obj.is_valid() 开始校验
3. is_valid()校验 is_bound 查看我们创建的MyForm是否空字段,和实例中是否传入了(request.POST)数据
4. is_valid() 调用self.errors 开始校验
5. errors 中调用self.full_clean() 开始校验
def full_clean(self): #查看full_clean() 方法
"""
Clean all of self.data and populate self._errors and self.cleaned_data.
"""
self._errors = ErrorDict()
if not self.is_bound: # Stop further processing.
return
self.cleaned_data = {}
# If the form is permitted to be empty, and none of the form data has
# changed from the initial data, short circuit any validation.
if self.empty_permitted and not self.has_changed():
return self._clean_fields() #这儿才是开始校验
self._clean_form()
self._post_clean() #这是个全局验证钩子,需要自己去子类里重写覆盖
6.查看full_clean()方法中,最后三个函数 self._clean_fields()就开始校验了
def _clean_fields(self): #找到_clean_fields() 函数
for name, field in self.fields.items():
# value_from_datadict() gets the data from the data dictionaries.
# Each widget type knows how to retrieve its own data, because some
# widgets split data over several HTML fields.
if field.disabled:
value = self.get_initial_for_field(field, name)
else:
value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
try:
if isinstance(field, FileField):
initial = self.get_initial_for_field(field, name)
value = field.clean(value, initial) #调用field.clean()开始校验
else:
value = field.clean(value)
self.cleaned_data[name] = value
if hasattr(self, 'clean_%s' % name):
value = getattr(self, 'clean_%s' % name)()
self.cleaned_data[name] = value #预留钩子用来自己做验证格式为 clean_字段名 这样的
except ValidationError as e:
self.add_error(name, e)
7.查看field.clean()它就是真的去校验了
def clean(self, value):
"""
Validate the given value and return its "cleaned" value as an
appropriate Python object. Raise ValidationError for any errors.
"""
value = self.to_python(value)
self.validate(value)
self.run_validators(value) #这两段代码 调用默认的正则规则,或者你提供的正则函数去循环验证
return value
8.验证完成(具体正则函数就不带着看了)
1. 首先is_valid()起手,看seld.errors中是否值,只要有值就是flase
2. 接着分析errors.里面判断_errors是都为空,如果为空返回self.full_clean(),否则返回self._errors
3. 现在就要看full_clean(),里面设置_errors和cleaned_data这两个字典,一个存错误字段,一个存储正确字段。
4. 在full_clean最后有一句self._clean_fields(),表示校验字段
5. 在_clean_fields函数中开始循环校验每个字段,真正校验字段的是field.clean(value),怎么校验的不管
6. 在_clean_fields中可以看到,会将字段分别添加到_errors和cleaned_data这两个字典中
7. 结尾部分还设置了钩子,找clean_XX形式的,有就执行。执行错误信息也会添加到_errors中
8. 校验完成
以下为钩子源码:
try:
...
if hasattr(self, 'clean_%s' % name):
value = getattr(self, 'clean_%s' % name)()
self.cleaned_data[name] = value #预留钩子用来自己做验证格式为 clean_字段名 这样的
except ValidationError as e:
self.add_error(name, e)
可以看到钩子代码中使用
try ... except ValidationError 错误并添加到errors中
class MyForm(form.Form):
...
# 钩子代码实例
def clean_user(self):
value = self.cleaned_data.get("user")
# 从正确的字段字典中取值
user_count = models.UserInfo.objects.filter(name=value).count()
#查看数据库中这个用户是否存在
if not value.isdigit():
# 如果这个字符串全部都是由数组组成
return value
elif user_count:
raise ValidationError("用户名已存在")
else:
# 注意这个报错信息已经确定了
raise ValidationError("用户名不能全部是数字组成")
# 在校验的循环中except ValidationError as e:,捕捉的就是这个异常
# 所以能将错误信息添加到_errors中
#全局钩子 _post_clean()
def _post_clean():
#自己在这儿全局验证,可以循环验证表单中所有的类容,
#父类中默认 pass 占位,不操作
pass
Form的is_valid校验规则及验证顺序的更多相关文章
- Django之form组件is_valid校验机制
#先来归纳一下整个流程 #()首先is_valid()起手,看seld.errors中是否值,只要有值就是flase #()接着分析errors.里面判断_errors是都为空,如果为空返回self. ...
- Django——form组件is_valid校验机制
#先来归纳一下整个流程#(1)首先is_valid()起手,看seld.errors中是否值,只要有值就是flase#(2)接着分析errors.里面判断_errors是都为空,如果为空返回self. ...
- JS密码校验规则前台验证(不能连续字符(如123、abc)连续3位或3位以上)(不能相同字符(如111、aaa)连续3位或3位以上)
密码必须为8到16位且必须包含数字和字母 密码必须包含特殊字符[_&#%] 不能连续字符(如123.abc)连续3位或3位以上 不能相同字符(如111.aaa)连续3位或3位以上 /** * ...
- vue+iview的form表单校验总结
这篇文章时关于如何使用iview的form表单校验.主要学习如何使用form校验(以校验文字长度为例),以及如何动态添加校验规则和异步校验. 1.为需要校验的表单添加form标签 <!--注意: ...
- Django中form组件的is_valid校验机制
先来归纳一下整个流程(1)首先is_valid()起手,看seld.errors中是否值,只要有值就是flase(2)接着分析errors.里面判断_errors是都为空,如果为空返回self.ful ...
- jQuery Validate 表单验证插件----通过name属性来关联字段来验证,改变默认的提示信息,将校验规则写到 js 代码中
一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW 访问密码 f224 二. 添加一个另外一个插件jquery.validate.messages_cn.js. ...
- jQuery Validate 表单验证插件----利用jquery.metadata.js将校验规则直接写在class属性里面并定义错误信息的提示
一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW 访问密码 f224 二. 添加一个另外一个插件jquery.metadata.js 并把校验规则写在控件里面 ...
- jQuery Validate 表单验证插件----在class属性中添加校验规则进行简单的校验
一.下载插件包. 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW 访问密码 f224 二.jQuery表单验证插件----添加class属性形式的校验 <!DOCTY ...
- Element Ui使用技巧——Form表单的校验规则rules详细说明
Element UI中对Form表单验证的使用介绍: Form 组件提供了表单验证的功能,只需要通过 rules 属性传入约定的验证规则,并将 Form-Item的 prop 属性设置为需校验的字段名 ...
随机推荐
- innerHTML的使用
inerHTML是html标签的属性,成对出现的标签大多数都有这个属性,用来设置或获取位于对象起始和结束标签 内的HTML.(获取HTML当前标签的起始和结束里面的内容)不包括标签本身. ...
- memcache缓存雪崩、缓存无底洞、缓存穿透、永久数据被踢现象
一.缓存雪崩现象 缓存雪崩一般是由某个缓存节点失效,导致其他节点的缓存命中率下降, 缓存中缺失的数据去数据库查询,短时间内造成数据库服务器崩溃, 重启DB短期又被压跨,但新数据的缓存也更新一些,DB反 ...
- update layer tree导致页面卡顿
前因 今天检查一个vue页面问题,就是在切换Tab时候(某些win10电脑),页面会卡顿一段很长的时间,短则3秒,长则十几秒,这个体验非常糟糕,于是我着手寻找其中原因. 概况 这个vue页面的元素非常 ...
- linux远程目录共享
一.环境介绍 1.服务器说明: 有两台服务器,(1)101报表服务器,上面是tomcat跑的原生FineReport报表系统,(2)103业务服务器,上面是具体的业务系统. 2.需求说明: 报表文件由 ...
- PHP程序员遇到职业问题时,是离职?还是坚持?
PHP程序员遇到职业问题时,是离职?还是坚持? 初级php程序员最担心在公司里遇到原本其他程序员开发的项目,他们“跑路”以后的工作就由新程序员完成.而新员工也不懂内部的逻辑,酱紫让程序员很难处理后续的 ...
- 开放标准-http://www.open-std.org/
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qianguozheng/article/details/37654877 http://www.op ...
- 第2章 认识JAVA虚拟机的基本结构
2.1 虚拟机的内存划分 垃圾回收系统既回收堆,也回收方法区和直接内存 直接内存其实是一块不受JVM管理的内存,但是收到计算机内存的限制 2.2 虚拟机参数 -Xmx:虚拟机最大可用内存 2.3 堆 ...
- 第1章 从开机加电到main函数之前的过程
主要讲解了80x86cpu在启动的时候时bios如何工作,以及如何最终转换到保护模式. 1.1 启动bios 80x86作为冯诺依曼结构下的cpu,工作模式也是取指执行,即cpu根据cs:ip寄存器的 ...
- 构建企业 YUM仓库
构建企业 YUM仓库 本地光盘提供基础软件包Base yum缓存提供update软件包 yum缓存提供常用软件包: nginx, zabbix, docker, saltstack 环境准备 系统 I ...
- 1.java的基础和数据类型
一.学习要求1.听课一定要全神贯注2.课堂笔记,一定要自己总结,而且要有很严谨的逻辑关系.提纲很重要3.作业不折不扣的完成,并且多完成4.阶段项目一定要独立完成5.每天早上由一位同学来进行早分享,内容 ...