日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Form的is_valid校验规则及验证顺序

發(fā)布時(shí)間:2023/12/18 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Form的is_valid校验规则及验证顺序 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、驗(yàn)證順序

?

  • 查看form下的源碼了解順序
    BaseForm為基類,中間包含了is_valid校驗(yàn)方法
@html_safe class BaseForm: .........self.is_bound = data is not None or files is not None ....... @property def errors(self): """Return an ErrorDict for the data provided for the form.""" if self._errors is None: self.full_clean() #---------------調(diào)用校驗(yàn)方法 return self._errors def is_valid(self): #--------------開始校驗(yàn) """Return True if the form has no errors, or False otherwise.""" return self.is_bound and not self.errors # ---------is_bound 中是數(shù)據(jù)和字段不能為空,否則就不校驗(yàn),沒(méi)問(wèn)題后調(diào)用self.errors開始校驗(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 value

8.驗(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: ...if 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)

可以看到鉤子代碼中使用
try ... except ValidationError 錯(cuò)誤并添加到errors中

class MyForm(form.Form):...# 鉤子代碼實(shí)例 def clean_user(self): value = self.cleaned_data.get("user") # 從正確的字段字典中取值 user_count = models.UserInfo.objects.filter(name=value).count() #查看數(shù)據(jù)庫(kù)中這個(gè)用戶是否存在 if not value.isdigit(): # 如果這個(gè)字符串全部都是由數(shù)組組成 return value elif user_count: raise ValidationError("用戶名已存在") else: # 注意這個(gè)報(bào)錯(cuò)信息已經(jīng)確定了 raise ValidationError("用戶名不能全部是數(shù)字組成") # 在校驗(yàn)的循環(huán)中except ValidationError as e:,捕捉的就是這個(gè)異常 # 所以能將錯(cuò)誤信息添加到_errors中 #全局鉤子 _post_clean() def _post_clean(): #自己在這兒全局驗(yàn)證,可以循環(huán)驗(yàn)證表單中所有的類容, #父類中默認(rèn) pass 占位,不操作 pass

?

轉(zhuǎn)載于:https://www.cnblogs.com/ellisonzhang/p/10709970.html

總結(jié)

以上是生活随笔為你收集整理的Form的is_valid校验规则及验证顺序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 黄网站视频在线观看 | 亚洲大逼 | 国产一区二区三区久久 | а√中文在线资源库 | 午夜成人影片 | 免费黄av | 婷婷伊人五月 | www色婷婷| 国产三级视频在线播放 | 三级网站在线免费观看 | 特级新鲜大片片 | 草莓巧克力香氛动漫的观看方法 | 麻豆一区产品精品蜜桃的特点 | 美日韩视频 | 日韩激情国产 | 国产午夜片 | 永久免费在线视频 | 91狠狠 | 日韩视频网站在线观看 | 国产激情对白 | 天堂网视频 | 久久狠| 久久婷婷国产 | 国精产品一区一区三区免费视频 | 欧美日韩精品一区二区三区视频播放 | 亚洲产国偷v产偷v自拍涩爱 | 日韩wwww | 91欧美大片 | 91精品国产麻豆国产自产在线 | 四虎最新域名 | 2021狠狠干 | 无码人妻丰满熟妇啪啪欧美 | 国产精品探花视频 | 欧美撒尿777hd撒尿 | 夜夜嗨av一区二区三区网页 | 亚洲无吗在线观看 | 欧美一级片免费 | 精品国产一区二区三区日日嗨 | 又大又粗又爽18禁免费看 | 麻豆精品视频在线 | 人妻无码一区二区三区久久99 | 在线观看岛国av | 懂色中文一区二区在线播放 | www.久久婷婷 | 日韩一区二区三区免费视频 | 五月天狠狠干 | 丰满少妇被猛烈进入高清播放 | 在线欧美一区二区 | 久久久久久97| 99精品偷自拍 | 伊人久久免费 | 黄色短视频在线播放 | 黄网站欧美内射 | www.色com | 久久久久久久久久网 | 一道本一区二区 | 天天玩夜夜操 | 成人国产精品一区二区 | 91久久极品少妇xxxxⅹ软件 | 大黄一级片 | 亚洲逼| 麻豆 国产 | 亚洲天堂社区 | av片网站| 三上悠亚 电影 | 中国xxxx性xxxx产国 | 国产精品水嫩水嫩 | 伊人青青草原 | 欧美裸体xxx | 日本美女视频网站 | 亚洲福利影院 | 欧美日韩视频无码一区二区三 | 久久春色 | 污污网站在线观看 | 国产又粗又深又猛又爽又在线观看 | 国产精品传媒 | av在线视| 凹凸精品熟女在线观看 | 成片免费观看 | 亚洲精品男人天堂 | 999热| 爽好多水快深点欧美视频 | 午夜性 | 最新国产网址 | 91黄址 | 在线黄色免费网站 | 超碰97国产在线 | 中文字幕在线视频不卡 | 亚洲黄色小视频 | 国内外免费激情视频 | 欧美自拍偷拍一区 | 少妇饥渴难耐 | 色噜噜狠狠一区二区三区牛牛影视 | 久久国产激情视频 | 欧美日韩国产高清视频 | 琪琪原网址 | 射黄视频 | 久久精品国产欧美亚洲人人爽 | 黑白配高清国语在线观看 |