电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Django def clean()函數(shù)對(duì)表單中的數(shù)據(jù)進(jìn)行驗(yàn)證操作

瀏覽:176日期:2024-09-27 10:42:05

最近寫的資源策略管理,在ceilometer 中創(chuàng)建alarm時(shí),name要求是不能重復(fù)的,所以在創(chuàng)建policy的時(shí)候,要對(duì)policy的name字段進(jìn)行驗(yàn)證,而django中正好擁有強(qiáng)大的表單數(shù)據(jù)驗(yàn)證的功能。

#這是policy中的name字段,在表單的數(shù)據(jù)進(jìn)行提交的時(shí)候,所有的數(shù)據(jù)流會(huì)經(jīng)過clean()這個(gè)函數(shù)

name = forms.CharField(max_length=255, label=_('Name'))

#在clean函數(shù)中先取出表單中的name字段,在從數(shù)據(jù)庫里面拿到所有的數(shù)據(jù)進(jìn)行檢查 def clean(self): cleaned_data = super(CreatePolicyForm, self).clean() name = cleaned_data.get(’name’) try: policys = api.nova.policy_list(self.request) except: exceptions.handle(request, _(’Unable to retrieve policys list.’)) if policys is not None and name is not None: for policy in policys:if policy.name.lower() == name.lower(): raise forms.ValidationError( _(’The name '%s' is already used by another policy.’) % name ) return cleaned_data

補(bǔ)充知識(shí):django中關(guān)于表單自定義驗(yàn)證器和常用驗(yàn)證器

常用驗(yàn)證器:

在驗(yàn)證某個(gè)字段的時(shí)候,可以傳遞一個(gè) validators 參數(shù)用來指定驗(yàn)證器,進(jìn)一步對(duì)數(shù)據(jù)進(jìn)行過濾。驗(yàn)證器有很多,但是很多驗(yàn)證器我們其實(shí)已經(jīng)通過這個(gè) Field 或者一些參數(shù)就可以指定了。比如 EmailValidator ,我們可以通過 EmailField 來指定,比如 MaxValueValidator ,我們可以通過 max_value 參數(shù)來指定。

以下是一些常用的驗(yàn)證器:

1. MaxValueValidator :驗(yàn)證最大值。

2. MinValueValidator :驗(yàn)證最小值。

3. MinLengthValidator :驗(yàn)證最小長(zhǎng)度。

4. MaxLengthValidator :驗(yàn)證最大長(zhǎng)度。

5. EmailValidator :驗(yàn)證是否是郵箱格式。

6. URLValidator :驗(yàn)證是否是 URL 格式。

7. RegexValidator :如果還需要更加復(fù)雜的驗(yàn)證,那么我們可以通過正則表達(dá)式的驗(yàn)證

器: RegexValidator 。比如現(xiàn)在要驗(yàn)證手機(jī)號(hào)碼是否合格,那么我們可以通過以下代碼實(shí)

現(xiàn):

class MyForm(forms.Form):

telephone = forms.CharField(validators=[validators.RegexValidator('1[345678]d{9}',message=’請(qǐng)輸入正確格式的手機(jī)號(hào)碼!’)])

自定義驗(yàn)證:

有時(shí)候?qū)σ粋€(gè)字段驗(yàn)證,不是一個(gè)長(zhǎng)度,一個(gè)正則表達(dá)式能夠?qū)懬宄模€需要一些其他復(fù)雜的邏輯,那么我們可以對(duì)某個(gè)字段,進(jìn)行自定義的驗(yàn)證。比如在注冊(cè)的表單驗(yàn)證中,我們想要驗(yàn)證手機(jī)號(hào)碼是否已經(jīng)被注冊(cè)過了,那么這時(shí)候就需要在數(shù)據(jù)庫中進(jìn)行判斷才知道。對(duì)某個(gè)字段進(jìn)行自定義的驗(yàn)證方式是,定義一個(gè)方法,這個(gè)方法的名字定義規(guī)則是: clean_fieldname 。如果驗(yàn)證失敗,那么就拋出一個(gè)驗(yàn)證錯(cuò)誤。比如要驗(yàn)證用戶表中手機(jī)號(hào)碼之前是否在數(shù)據(jù)庫中存在,那么可以通過以下代碼實(shí)現(xiàn):

class MyForm(forms.Form):telephone = forms.CharField(validators=[validators.RegexValidator('1[345678]d{9}',message=’請(qǐng)輸入正確格式的手機(jī)號(hào)碼!’)])def clean_telephone(self):telephone = self.cleaned_data.get(’telephone’)exists = User.objects.filter(telephone=telephone).exists()if exists:raise forms.ValidationError('手機(jī)號(hào)碼已經(jīng)存在!')else:return telephone

以上是對(duì)某個(gè)字段進(jìn)行驗(yàn)證,如果驗(yàn)證數(shù)據(jù)的時(shí)候,需要針對(duì)多個(gè)字段進(jìn)行驗(yàn)證,那么可以重寫 clean 方法。比如要在注冊(cè)的時(shí)候,要判斷提交的兩個(gè)密碼是否相等。那么可以使用以下代碼來完成:

class MyForm(forms.Form):telephone = forms.CharField(validators=[validators.RegexValidator('1[345678]d{9}',message=’請(qǐng)輸入正確格式的手機(jī)號(hào)碼!’)])pwd1 = forms.CharField(max_length=12)pwd2 = forms.CharField(max_length=12)def clean(self):cleaned_data = super().clean()pwd1 = cleaned_data.get(’pwd1’)pwd2 = cleaned_data.get(’pwd2’)if pwd1 != pwd2:raise forms.ValidationError(’兩個(gè)密碼不一致!’)

提取錯(cuò)誤信息:

如果驗(yàn)證失敗了,那么有一些錯(cuò)誤信息是我們需要傳給前端的。這時(shí)候我們可以通過以下屬性來獲取:

1. form.errors :這個(gè)屬性獲取的錯(cuò)誤信息是一個(gè)包含了 html 標(biāo)簽的錯(cuò)誤信息。

2. form.errors.get_json_data() :這個(gè)方法獲取到的是一個(gè)字典類型的錯(cuò)誤信息。將某個(gè)字段的名字作為 key ,錯(cuò)誤信息作為值的一個(gè)字典。

3. form.as_json() :這個(gè)方法是將 form.get_json_data() 返回的字典 dump 成 json 格式的字符串,方便進(jìn)行傳輸。

4. 上述方法獲取的字段的錯(cuò)誤值,都是一個(gè)比較復(fù)雜的數(shù)據(jù)。比如以下:

{’username’: [{’message’: ’Enter a valid URL.’, ’code’: ’invalid’}, {’message’: ’Ensurethis value has at most 4 characters (it has 22).’, ’code’: ’max_length’}]}

那么如果我只想把錯(cuò)誤信息放在一個(gè)列表中,而不要再放在一個(gè)字典中。這時(shí)候我們可以定義一個(gè)方法,把這個(gè)數(shù)據(jù)重新整理一份。實(shí)例代碼如下:

class MyForm(forms.Form):username = forms.URLField(max_length=4)def get_errors(self):errors = self.errors.get_json_data()new_errors = {}for key,message_dicts in errors.items():messages = []for message in message_dicts:messages.append(message[’message’])new_errors[key] = messagesreturn new_errors

這樣就可以把某個(gè)字段所有的錯(cuò)誤信息直接放在這個(gè)列表中。

以上這篇Django def clean()函數(shù)對(duì)表單中的數(shù)據(jù)進(jìn)行驗(yàn)證操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Django
相關(guān)文章:
主站蜘蛛池模板: 浙江上沪阀门有限公司 | 车充外壳,车载充电器外壳,车载点烟器外壳,点烟器连接头,旅行充充电器外壳,手机充电器外壳,深圳市华科达塑胶五金有限公司 | 污水/卧式/潜水/钻井/矿用/大型/小型/泥浆泵,价格,参数,型号,厂家 - 安平县鼎千泵业制造厂 | 导电银胶_LED封装导电银胶_半导体封装导电胶厂家-上海腾烁 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | 便携式谷丙转氨酶检测仪|华图生物科技百科 | 小型单室真空包装机,食品单室真空包装机-百科 | 复合土工膜厂家|hdpe防渗土工膜|复合防渗土工布|玻璃纤维|双向塑料土工格栅-安徽路建新材料有限公司 | 耐腐蚀泵,耐腐蚀真空泵,玻璃钢真空泵-淄博华舜耐腐蚀真空泵有限公司 | CXB船用变压器-JCZ系列制动器-HH101船用铜质开关-上海永上船舶电器厂 | 海德莱电力(HYDELEY)-无功补偿元器件生产厂家-二十年专业从事电力电容器 | 3d打印服务,3d打印汽车,三维扫描,硅胶复模,手板,快速模具,深圳市精速三维打印科技有限公司 | 聚氨酯保温钢管_聚氨酯直埋保温管道_聚氨酯发泡保温管厂家-沧州万荣防腐保温管道有限公司 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库 | 路斯特伺服驱动器维修,伦茨伺服驱动器维修|万骏自动化百科 | elisa试剂盒-PCR试剂盒「上海谷研实业有限公司」 | 房屋质量检测-厂房抗震鉴定-玻璃幕墙检测-房屋安全鉴定机构 | 安徽泰科检测科技有限公司【官方网站】 | 船用锚链|专业锚链生产厂家|安徽亚太锚链制造有限公司 | 密封无忧网 _ 专业的密封产品行业信息网| 超声波反应釜【百科】-以马内利仪器 | POS机办理_个人POS机免费领取 - 银联POS机申请首页 | 清水混凝土修复_混凝土色差修复剂_混凝土色差调整剂_清水混凝土色差修复_河南天工 | 辊道窑炉,辊道窑炉厂家-山东艾希尔 | 全自动不干胶贴标机_套标机-上海今昂贴标机生产厂家 | 垃圾处理设备_餐厨垃圾处理设备_厨余垃圾处理设备_果蔬垃圾处理设备-深圳市三盛环保科技有限公司 | 光伏家 - 太阳能光伏发电_分布式光伏发电_太阳能光伏网 | 暖气片十大品牌厂家_铜铝复合暖气片厂家_暖气片什么牌子好_欣鑫达散热器 | 无缝方管|无缝矩形管|无缝方矩管|无锡方管厂家 | 工业硝酸钠,硝酸钠厂家-淄博「文海工贸」 | 注塑机-压铸机-塑料注塑机-卧式注塑机-高速注塑机-单缸注塑机厂家-广东联升精密智能装备科技有限公司 | 合肥抖音SEO网站优化-网站建设-网络推广营销公司-百度爱采购-安徽企匠科技 | 大连海岛旅游网>>大连旅游,大连海岛游,旅游景点攻略,海岛旅游官网 | 交联度测试仪-湿漏电流测试仪-双85恒温恒湿试验箱-常州市科迈实验仪器有限公司 | EPK超声波测厚仪,德国EPK测厚仪维修-上海树信仪器仪表有限公司 | 宁夏档案密集柜,智能密集柜,电动手摇密集柜-盛隆柜业宁夏档案密集柜厂家 | 代写标书-专业代做标书-商业计划书代写「深圳卓越创兴公司」 | 氧化铁红厂家-淄博宗昂化工 | 天助网 - 中小企业全网推广平台_生态整合营销知名服务商_天助网采购优选 | 荣事达手推洗地机_洗地机厂家_驾驶式扫地机_工业清洁设备 | 食品机械专用传感器-落料放大器-低价接近开关-菲德自控技术(天津)有限公司 |