Django之form组件is_valid校验机制

先来归纳一下整个流程
首先is_valid()起手,看seld.errors中是否值,只要有值就是flase
接着分析errors.里面判断_errors是都为空,如果为空返回self.full_clean(),否则返回self._errors
现在就要看full_clean(),是何方神圣了,里面设置_errors和cleaned_data这两个字典,一个存错误字段,一个存储正确字段。
在full_clean最后有一句self._clean_fields(),表示校验字段
在_clean_fields函数中开始循环校验每个字段,真正校验字段的是field.clean(value),怎么校验的不管
在_clean_fields中可以看到,会将字段分别添加到_errors和cleaned_data这两个字典中
结尾部分还设置了钩子,找clean_XX形式的,有就执行。执行错误信息也会添加到_errors中
整个校验过程完成

 

#下面分析form组件中is_valid校验的流程
#在分析过程中重点关注_errors和cleaned_data这两个字典

def login(request):
    if request.method == "POST":
        form_obj = LoginForm(request.POST)
        if form_obj.is_valid():#is_valid这里开始判断
            #如果检验全部通过
            print(form_obj.cleaned_data) #cleaned_data,全部数据都在这里 ,类型字典
            return HttpResponse("你好,欢迎回来!")
        else:
            print(form_obj.cleaned_data) 	#这里是校验正确的数据
            print(form_obj.errors)		 	#这里是校验错误的信息
			print(form_obj.errors.as_json())#json格式的校验错误信息
									#错误信息来源定义字段error_message={'required':'错误信息','invalid':'格式错误'}					
            return render(request, "login.html", {"form_obj": form_obj,)

    form_obj = LoginForm()
    return render(request, "login.html", {"form_obj": form_obj})

  

form表单的校验方法is_valid()

 

 

  点开我们发现这个函数里面只有两个方法方法,最终返回True or False

 

  我们点进.is_bound属性,里面判断传输的数据不是空和上传文件不是空

 

 

 点进.errors发现这是一个方法伪装成属性,用的是内置的装饰器property,

这里有个简单的逻辑判断大家都看的懂吧,判断有没有报错的信息,没有错误信息就执行self.full_clean()

 

 我们看看执行也看看返回的 self._errors,发现开始是空,经过self.full_clean() self._errors值可能发生变化

 

 

这下我们来看full_clean,self._errors获取ErrorDict()的实例化对象,

我们来瞄一眼ErrorDict:

 

 

 self.cleaned_data  定义为空的字典,还有self.empty_permitted 和not self.has_changed(),我们也来瞄一眼

self.empty_permitted

 

 

not self.has_changed()    有值就为False  ,没有值就为True,

 

 

看完上面部分,我们来看下面的self._clean_fields(),self._clean_form()

 

 

 走到这里我们发现,封装这个功能的作者,留下了可拓展的地方

 

 

 

 

 自定义表单验证规则:

 

posted @ 2020-05-31 16:05  JIMfan  阅读(160)  评论(0编辑  收藏  举报