Form的is_valid校验规则及验证顺序
?
- 查看form下的源碼了解順序
BaseForm為基類,中間包含了is_valid校驗(yàn)方法
- is_valid 的校驗(yàn)順序
1.?obj = MyForm(request.POST) 創(chuàng)建將要校驗(yàn)的實(shí)例
2.?obj.is_valid() 開始校驗(yàn)
3.?is_valid()校驗(yàn) is_bound 查看我們創(chuàng)建的MyForm是否空字段,和實(shí)例中是否傳入了(request.POST)數(shù)據(jù)
4.?is_valid() 調(diào)用self.errors 開始校驗(yàn)
5.?errors 中調(diào)用self.full_clean() 開始校驗(yàn)
def full_clean(self): #查看full_clean() 方法"""Clean all of self.data and populate self._errors and self.cleaned_data."""self._errors = ErrorDict()if not self.is_bound: # Stop further processing.returnself.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() #這兒才是開始校驗(yàn)self._clean_form()self._post_clean() #這是個(gè)全局驗(yàn)證鉤子,需要自己去子類里重寫覆蓋6.查看full_clean()方法中,最后三個(gè)函數(shù) self._clean_fields()就開始校驗(yàn)了
def _clean_fields(self): #找到_clean_fields() 函數(shù)for name, field in self.fields.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.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) #調(diào)用field.clean()開始校驗(yàn)else:value = field.clean(value)self.cleaned_data[name] = valueif hasattr(self, 'clean_%s' % name): value = getattr(self, 'clean_%s' % name)()self.cleaned_data[name] = value #預(yù)留鉤子用來(lái)自己做驗(yàn)證格式為 clean_字段名 這樣的except ValidationError as e:self.add_error(name, e)7.查看field.clean()它就是真的去校驗(yàn)了
def clean(self, value):"""Validate the given value and return its "cleaned" value as anappropriate Python object. Raise ValidationError for any errors."""value = self.to_python(value)self.validate(value)self.run_validators(value) #這兩段代碼 調(diào)用默認(rèn)的正則規(guī)則,或者你提供的正則函數(shù)去循環(huán)驗(yàn)證return value8.驗(yàn)證完成(具體正則函數(shù)就不帶著看了)
?
1.2 總結(jié)順序?
1.?首先is_valid()起手,看seld.errors中是否值,只要有值就是flase
2.?接著分析errors.里面判斷_errors是都為空,如果為空返回self.full_clean(),否則返回self._errors
3.?現(xiàn)在就要看full_clean(),里面設(shè)置_errors和cleaned_data這兩個(gè)字典,一個(gè)存錯(cuò)誤字段,一個(gè)存儲(chǔ)正確字段。
4.?在full_clean最后有一句self._clean_fields(),表示校驗(yàn)字段
5.?在_clean_fields函數(shù)中開始循環(huán)校驗(yàn)每個(gè)字段,真正校驗(yàn)字段的是field.clean(value),怎么校驗(yàn)的不管
6.?在_clean_fields中可以看到,會(huì)將字段分別添加到_errors和cleaned_data這兩個(gè)字典中
7.?結(jié)尾部分還設(shè)置了鉤子,找clean_XX形式的,有就執(zhí)行。執(zhí)行錯(cuò)誤信息也會(huì)添加到_errors中
8.?校驗(yàn)完成
?
二、鉤子驗(yàn)證?
-
以下為鉤子源碼:
可以看到鉤子代碼中使用
try ... except ValidationError 錯(cuò)誤并添加到errors中
?
轉(zhuǎn)載于:https://www.cnblogs.com/ellisonzhang/p/10709970.html
總結(jié)
以上是生活随笔為你收集整理的Form的is_valid校验规则及验证顺序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在ubuntu 12.04上安装tomc
- 下一篇: Python中高级变量类型(列表,元组,