先来归纳一下整个流程
(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)整个校验过程完成
下面分析form组件中is_valid校验的流程
在分析过程中重点关注_erroes和clean_data这两个字典
def login(request):
if request.method == "POST":
form_obj = LoginForm(request.POST)
if form_obj.is_valid():
#如果检验全部通过
print(form_obj.clean_data) #这里全部都没问题
return HttpResponse("你好,欢迎回来!")
else:
#print(form_obj.clean_data)
#print(form_obj.errors)
return render(request, "login.html", {"form_obj": form_obj,) form_obj = LoginForm()
return render(request, "login.html", {"form_obj": form_obj})
钩子代码实例
def clean_user(self):
val1 = self.cleaned_data.get("user")
#从正确的字段字典中取值
#如果这个字符串全部都是由数组组成
if not val1.isdigit():
return val1
else:
# 注意这个报错信息已经确定了
raise ValidationError("用户名不能全部是数字组成")
#在校验的循环中except ValidationError as e:,捕捉的就是这个异常
#所以能将错误信息添加到_errors中 #代码分析部分
def is_valid(self):
"""
Returns True if the form has no errors. Otherwise, False. If errors are
being ignored, returns False.
如果表单没有错误,则返回true。否则为假。如果错误是被忽略,返回false。
"""
return self.is_bound and not self.errors
#is_bound默认有值
#只要self.errors中有一个值,not True = false,返回的就是false def errors(self):
"""
Returns an ErrorDict for the data provided for the form
返回一个ErrorDict在form表单存在的前提下
"""
if self._errors is None:
self.full_clean()
return self._errors def full_clean(self):
"""
Cleans all of self.data and populates self._errors and self.cleaned_data.
清除所有的self.data和本地的self._errors和selif.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() def _clean_fields(self):
#每个form组件实例化的过程中都会创建一个fields。fields实质上是一个字典。
#储存着类似{"user":"user规则","pwd":"pwd的规则对象"}
for name, field in self.fields.items():
#name是你调用的一个个规则字段,field是调用字段的规则
#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. value_from_datadict()从数据字典中获取数据。
每个部件类型知道如何找回自己的数据,因为有些部件拆分数据在几个HTML字段。
"""
#现在假设第一个字段是user
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)
#filed是一个对象,field.clean才是真正的规则校验
else:
#你不是文件的时候怎么校验
#实际中也是走的这一部,value是你输入的字段值
#如果没有问题,那么原样返回
value = field.clean(value)
#如果一旦出现问题,那么就会走except中的代码
self.cleaned_data[name] = value if hasattr(self, 'clean_%s' % name): #这里找是否有clean_XX这个名字存在
value = getattr(self, 'clean_%s' % name)() #如果有执行这个函数
self.cleaned_data[name] = value #而在钩子中必须报错的返回值是确定的
#如果上面有问题,就又把错误添加到了_error中
#上面这三行代码是我们能添加钩子的原因,而且规定了钩子名的格式 #如果这个值是正确的话,就会给这个字典添加一个键值对
#刚才在full_clean中self.cleaned_data = {}已经初始化了。
#{”pws“:123}
except ValidationError as e:
self.add_error(name, e)
#如果出现错误,就会给_error这个字典添加一个键值对
#至于add_error这个函数如何添加这个键值对的,我们先不管
#键就是name,值就是错误信息e
#在full_clean中已经初始化self._errors = ErrorDict()
#假设现在user有问题,那么_error就是这样{”user“:e}

is_valid校验机制的更多相关文章

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

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

  2. Django——form组件is_valid校验机制

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

  3. Django中form组件的is_valid校验机制

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

  4. java jvm学习笔记十二(访问控制器的栈校验机制)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们 ...

  5. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  6. Struts2请求参数合法性校验机制

    在Action中通过代码执行数据校验 请求参数的输入校验途径一般分两种:客户端校验 :通过JavaScript 完成 (jquery validation插件),目的:过滤正常用户的误操作. 服务器校 ...

  7. SpringMVC提供两种校验机制

    本文不讲如何使用SpringMVC提供的两种校验机制,只是简单的说明一下其中的差别而已: 1.创建一个Bean,在Bean的属性中添加校验信息,通过配置LocalValidatorFactoryBea ...

  8. Form的is_valid校验规则及验证顺序

    一.验证顺序   查看form下的源码了解顺序 BaseForm为基类,中间包含了is_valid校验方法 @html_safe class BaseForm: ......... self.is_b ...

  9. 全栈之路-小程序API-SpringBoot项目中参数校验机制与LomBok工具集使用

    参数校验机制在web开发中是非常重要的,每当看到现在所在公司的校验代码,我都有头疼,每一个接口都是重新写参数的校验,有些复杂的接口,参数的校验甚至占了整个接口代码量的挺大一部分的,看着我都有些头疼,我 ...

随机推荐

  1. Docker两种方式进入后台运行的容器

    1.在启动容器的时候,有时候我们加了参数-d,这时容器自动进入后台运行.如果我们要进入容器,该怎么办?通常使用docker attach命令和nsenter工具. 2.docker attach是Do ...

  2. zmq setsockopt()

    zmq.RCVTIMEO:在一个recv操作返回EAGAIN错误前的最大时间 设置socket的接收操作超时时间.如果属性值是0,zmq_recv(3)函数将会立刻返回,如果没有接收到任何消息,将会返 ...

  3. (转)Sphinx中文分词安装配置及API调用

    这几天项目中需要重新做一个关于商品的全文搜索功能,于是想到了用Sphinx,因为需要中文分词,所以选择了Sphinx for chinese,当然你也可以选择coreseek,建议这两个中选择一个,暂 ...

  4. Struts2之ValueStack、ActionContext

    今天在看Action获取Resquest.Response时,发现了一个词:值栈.于是今天一天都在看,了解了值栈不仅能知道Action怎么获取request.response等这些,还会了解OGNL语 ...

  5. Linux IPC基础(System V)

    简介 IPC 主要有消息队列.信号量和共享内存3种机制.和文件一样,IPC 在使用前必须先创建,使用 ipcs 命令可以查看当前系统正在使用的 IPC 工具: 由以上可以看出,一个 IPC 至少包含 ...

  6. MyBatis——MyEclipse中使用mybatis-generator

    mybatis-generator可以根据数据库的表来生成POJO类.mapper.xml和DAO接口,用这个插件会大大地提高开发的效率.网上虽然有一些使用这个插件的教程,但我单个试了并不能成功,会出 ...

  7. 弱引用(WeakReference)

    在应用程序代码内实例化一个类或结构时,只要有代码引用它,就会形成强引用.这意味着垃圾回收器不会清理这样的对象使用的内存.但是如果当这个对象很大,并且不经常访问时,此时可以创建对象的弱引用,弱引用允许创 ...

  8. dotnet 从入门到放弃的 500 篇文章合集

    本文是记录我从入门到放弃写的博客 博客包括 C#.WPF.UWP.dotnet core .git 和 VisualStudio 和一些算法,所有博客使用 docx 保存 下载:dotnet 从入门到 ...

  9. asp.net通过后台代码给前台设置css样式,下拉列表在js中的取值

    后台根据不同的用户登陆隐藏或显示前台div标签 前台: 将div声明成服务器端控件 <div id="div1" runat="server">.. ...

  10. Spring Security OAuth2 SSO 单点登录

    基于 Spring Security OAuth2 SSO 单点登录系统 SSO简介 单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自 ...