Django Form钩子方法源码分析

武校长Python全栈课程 / 2023-08-13 / 原文

1. 用法

 

在Form类中定义名称为 clean_ + form字段名称 的方法

校验成功 返回 self.clean_data["字段名"]

校验失败 会raise 报错

 

2. 源码分析

先从is_valid 方法开始分析

 当self._is_bound = True, self.errors 为False时 校验成功

1. self._is_bound

 当django项目启动时data是空的,也就是在get方法时实例化form类

 当执行POST方法时传入request.POST

 这里data就等于request.POST

self._is_bound = data = request.POST传递的信息

2. self.error

 data 刚传递进来还没有执行校验self_error = None

会执行self.full_clean方法

 2.1 self._clean_field()

 self[name]在form源码分析2中有提及,

self[name]  = form["mobile"] 拿到default_template生成的input标签

 

!! 下面的clean_field方法是关键

 第一次for循环, 拿到 name = mobile, bf = self['mobile']

field = bf.field = self['mobile'].field = mobile对应的charfield

value = 15304274820

下面走到了try, except 

try:

 except:

如果有任何报错都会执行add_error方法,

将报错存入

如果try里有报错

执行add_error方法