Django——form组件is_valid校验机制

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

原文地址:https://www.cnblogs.com/yangmingxianshen/p/8402406.html

时间: 2024-11-08 01:44:12

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

17 Django Form组件

目录 一.Form 介绍 二.注册功能校验数据案例 1.普通方式手写注册功能 2. 使用Form组件实现注册功能校验数据 三.Form组件如何校验数据 四.Form组件如何渲染前端页面 方式一: 方式二: 方式三: 五.Form组件如何展示错误信息 六.Form组件 参数 七.Form组件 钩子函数 1. 局部钩子函数 2. 全局钩子函数 一.Form 介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多

Django ==> Form 组件

Django ==> Form 组件 目录: 1.基本使用 2.form中字段和插件 3.自定义验证规则 4.动态加载数据到form中 Action: 1.基本使用 django 中的Form组件有一下功能: 1.生成html标签 2.验证用户数据(显示错误信息) 3.html form 提交保留上次提交数据 4.初始化页面显示内容 要使用 form 类,首先需要创建这个类,方法如下: from django.forms import Form from django.forms import

[oldboy-django][2深入django]Form组件功能: 数据格式验证 + 保留上次输入的值(如果有很多输入项,这样正确项不必重复输入,错误项也能提示错误信息)

1 需求:登录或者注册页面存在以下问题 - 无法记住上次提交的内容,(如果有很多输入项,这样正确项不必重复输入,错误项也能提示错误信息)- 重复进行提交数据的校验(数据是否为空,长度大小等等) 2 django的Form组件实现 2.1 Form组件实现数据验证方法 2.1.1 流程操作 - 定义规则(数据的格式,字段必须和表单上name属性一致) class LoginForm(Form): 字段名 = fields.xxFields(参数) # 定义了一个输入框的数据格式要求 实例化对象ob

Django——form组件

之前我们已经学习了HTML中的基本标签--form表单,我们经常使用它向后台提交数据,常规的form表单是这样的: <form action="" method="post"> <p>用户名:<input type="text" name="user"></p> <p>密码:<input type="text" name="pwd&

Django form组件 与 cookie/session

目录 一.form组件 二.cookie.session 一.form组件 1.1 以注册功能为例 注册功能 1.渲染前端标签获取用户输入 --> 渲染标签 2.获取用户输入传递到后端校验 --> 校验数据 3.校验未通过展示错误信息 --> 展示信息 ps:校验数据:前后端都可以校验,但是前端可以不做,后端必须得做!!! 1.2 校验数据 校验数据 第一步需要一个form类 from django import forms class MyForm(forms.Form): name

django Form组件 上传文件

上传文件 注意:FORM表单提交文件要有一个参数enctype="multipart/form-data" 普通上传: urls: url(r'^f1/',views.f1), url(r'^f2/',views.f2), views: def f1(request): if request.method == "GET": return render(request,'f1.html') else: import os #导入os模块 #request.get /

Django Form组件实例:登录界面[Form表单提交,Ajax提交]

"""本例中使用Form和Ajax进行了数据提交,Form提交有一个问题,就是输入错误的数据,刷新之后原有的数据会丢失.注意到Form组件可以生成HTML标签,将Form生成的对象传到前端,就可以保留原有的内容,具体见下文:""" 1 from django.shortcuts import * 2 from app02 import models 3 import json 4 5 # Create your views here. 6 def

9.Django form组件

Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 创建Form类时,主要涉及到 [字段] 和 [插件],字段用于对用户请求数据的验证,插件用于自动生成HTML; 1.内置字段 Field required=True, 是否允许为空 widget=None, HTML插件 label=None, 用于生成Label标签或显示内容 initial=None, 初始值 help_tex

Django Form的基本实现机制和基本概念

基于Django1.9 Doc-Form 本文只是理清Django Form系统中的关键概念和关键流程,没有关注其中的细节实现, 目的是对Djano的Form实现机制能有一个直观的了解,能够从从整体上把握它. 如果想深入了解代码实现及各种技术细节,可以阅读Django官方文档. 1 为什么要使用Django Form? 什么情况下要使用Django Form? Unless you’re planning to build websites and applications that do no