一、验证顺序
  • 查看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.returnself.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] = valueif 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 anappropriate Python object. Raise ValidationError for any errors."""value = self.to_python(value)self.validate(value)self.run_validators(value) #这两段代码  调用默认的正则规则,或者你提供的正则函数去循环验证return value

8.验证完成(具体正则函数就不带着看了)

1.2 总结顺序

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

转载于:https://www.cnblogs.com/ellisonzhang/p/10709970.html

Form的is_valid校验规则及验证顺序相关推荐

  1. Django之form组件is_valid校验机制

    #先来归纳一下整个流程 #(1)首先is_valid()起手,看seld.errors中是否值,只要有值就是flase #(2)接着分析errors.里面判断_errors是都为空,如果为空返回sel ...

  2. JS密码校验规则前台验证(不能连续字符(如123、abc)连续3位或3位以上)(不能相同字符(如111、aaa)连续3位或3位以上)

    密码必须为8到16位且必须包含数字和字母 密码必须包含特殊字符[_&#%] 不能连续字符(如123.abc)连续3位或3位以上 不能相同字符(如111.aaa)连续3位或3位以上 /*** 外 ...

  3. JS密码校验规则前台验证(不能连续字符(如123、abc)连续3位或3位以上)(不能相同字符(如111、aaa)连续3位或3位以上)...

    密码必须为8到16位且必须包含数字和字母 密码必须包含特殊字符[_&#%] 不能连续字符(如123.abc)连续3位或3位以上 不能相同字符(如111.aaa)连续3位或3位以上 /*** 外 ...

  4. element 修改表单值后表单验证无效_element 表单自定义校验规则

    首先在我们的vue + element 项目中,尤其是后台有关的项目或者涉及到大量操作数据的平台,重中之重的就是关于数据的验证,也就是关于我们表单的验证,如果在前端做好了这些,相当于在前后台交互数据的 ...

  5. element-UI框架使用validate.js的form校验规则(+自定义验证代码)- 应用篇

    文章目录 element-UI除了官方给出的校验规则,还可以自定义(举例如下) 代码示例: 参考文章: element-UI除了官方给出的校验规则,还可以自定义(举例如下) element-UI框架f ...

  6. Element-ui Form表单校验-兜底校验-自定义检验规则

    用户登录表单-数据双向绑定 <template><div class="form-container"><el-form label-width=&q ...

  7. jQuery Validate 表单验证插件----在class属性中添加校验规则进行简单的校验

    一.下载插件包. 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW  访问密码 f224 二.jQuery表单验证插件----添加class属性形式的校验 <!DOCTY ...

  8. vue表单验证,多种校验规则

    前言 vue 表单验证,具体的大家根据自身项目和框架来,本文以antd举例. 实现 这里以antd 举例 <template><a-form-model ref="rule ...

  9. Element Ui使用技巧——Form表单的校验规则rules详细说明;element的 form 表单rules详细用法

    本文章是在项目开发时遇到问题看到的一片好文, 摘录自[博客园]–[逍遥云天]. 感谢作者 地址 – https://www.cnblogs.com/xyyt/p/13366812.html 在 [逍遥 ...

最新文章

  1. JAVA_OA(六):SpringMVC登陆实例
  2. SSM整合时配置文件的编写
  3. 数据挖掘:分享两个Pandas使用小陷阱
  4. 为什么技术最牛的码农当不了首席工程师?
  5. axure怎么做5秒倒计时_装修隔音怎么做,进屋秒变“静音”模式
  6. 创业公司,没有好领导,有多少人才都是死路一条
  7. sqlserver 查询一个表的所有字段代码
  8. 关于企业应用SAP成本管理模式与方法的一些思考
  9. numpy 常用工具函数 —— np.bincount/np.average
  10. 用户体验的13条金科玉律
  11. 实践项目二:图书馆管理系统 总结
  12. python处理地震sac数据_自己开发的一个SEED格式地震数据转换为SAC格式数据,并完成世界时整天波形合并的Python脚本...
  13. beyond compare 对class文件反编译及比较
  14. 随e行wlan v9.2.0930
  15. linux 消息队列大小设置,linux 消息队列 参数
  16. BZOJ 1260 paint
  17. HihoCoder - 1829 Tomb Raider (暴力+最长上升子序列)
  18. mysql 临时表联表查询_一、MySQL中使用从表A中取出数据来更新表B的内容例如:要update表data中的一些列属性,但是修改属性的内容来源是来自表chanpin。SQL语言中不...
  19. sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk'
  20. GDT(全居描述符表)和LDT(局部描述符表)

热门文章

  1. 语义化版本(semantic versioning)机制里的一些范围标识符
  2. java关于泛型的实验代码_[ Java学习 ] 泛型类的应用实验
  3. 剑指offer刷题(java)|二维数组中的查找|替换空格|leetcode刷题
  4. numa节点_极致性能(1):以NUMA为起点
  5. Hadoop——分布式资源管理框架YARN总结
  6. PHP快速导入,php快速导入大量数据的实例方法
  7. 计算机使用技巧爆文,关于小红书爆文的10个小技巧
  8. python 概率分布_python实现beta分布概率密度函数的方法
  9. 三相pmsm矢量控制仿真模型_低载波比工况下永磁同步电机磁链矢量轨迹分析
  10. python写ui自动化测试用例_自动化测试(6) | Web UI 自动化测试方案