#先来归纳一下整个流程
#(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}

Django——form组件is_valid校验机制的更多相关文章

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

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

  2. Python - Django - form 组件自定义校验

    reg2.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  3. 9.24 Django Form组件

    2018-9-23 20:10:04 这两天优化了自己图书管理系统 github 连接:https://github.com/TrueNewBee/pythonDemo 顺便整理了博客,写了好多总结, ...

  4. Django—Form组件

    Django From简介 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比 ...

  5. django form组件 cookies,session

    django form组件 渲染标签  就是组件里面的字段在前端展示叫做渲染标签 校验数据  用户输入的数据提交给后端组件叫做校验数据 forms组件中定义的字段都是必须传值的(required=Tr ...

  6. 6月28日 Django form组件 和 modelform组件

    Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...

  7. django Form组件

    django Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建 ...

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

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

  9. 饮冰三年-人工智能-Python-27 Django Form组件

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 后台逻辑(导包+建类) from django ...

随机推荐

  1. 【IOS】mac终端运行.sh文件总是提示permission denied

    如果我目录jni有一个list.sh文件 我直接 nxgametekiMacBook-Air:jni luonan$  ./list.sh ../../Classes 提示 permission de ...

  2. 算法练习--ABCD*E=DCBA

    //1.ABCD * E = DBCA//2.A,B,C,D {0-9} , E {1-9}//3.A,B,C,D,E all different var existSameN = function ...

  3. Java Swing界面编程(21)---事件处理:窗口事件

    WindowLIstener是专门处理窗口的事件监听窗口.一个窗口的全部变化.如窗口的打开.关闭等都能够使用这个接口进行监听. 实现WIndowListener: package com.beyole ...

  4. 操作log.py

    # 把双数日期的日志,里面给随便写点东西# 1.获取到log目录下的所有文件os.walk()# 2.根据文件名来判断,是否是双数日期,分割字符串,取到日期# 3.12%2==0# 4.打开这个文件 ...

  5. 会话管理之Cookie技术

    会话管理是web开发中比较重要的环节,这一节主要总结下会话管理中的cookie技术. 1. 何为会话 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个 ...

  6. HDU 1014 Uniform Generator 题解

    找到规律之后本题就是水题了.只是找规律也不太easy的.证明这个规律成立更加不easy. 本题就是求step和mod假设GCD(最大公约数位1)那么就是Good Choice,否则为Bad Choic ...

  7. angularjs2中的非父子组件的通信

    AngualrJs2官方方法是以@Input,@Output来实现组件间的相互传值,而且组件之间必须父子关系,下面给大家提供一个简单的方法,实现组件间的传值,不仅仅是父子组件,跨模块的组件也可以实现传 ...

  8. 解决Windows平台通过cURL上传APP到蒲公英pgyer平台时无法使用中文升级描述的问题

    解决Windows平台通过cURL上传APP到蒲公英pgyer平台时无法使用中文升级描述的问题 官方上传命令 curl -F file=@"315.apk" -F uKey=XXX ...

  9. Linux下Java、Maven、Tomcat的安装

    1.安装Java(此处假定安装文件夹位/usr/local) 1)下载jdk(jdk-7),下载地址例如以下: 32位:http://download.oracle.com/otn-pub/java/ ...

  10. 【demo练习二】:WPF依赖属性的练习

    2016-10-11 依赖属性demo小样: 要求:在窗口中点击按钮,利用设置“依赖属性”把Label和TextBox控件里的属性值进行改变. ============================ ...