国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Django def clean()函數對表單中的數據進行驗證操作

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

最近寫的資源策略管理,在ceilometer 中創建alarm時,name要求是不能重復的,所以在創建policy的時候,要對policy的name字段進行驗證,而django中正好擁有強大的表單數據驗證的功能。

#這是policy中的name字段,在表單的數據進行提交的時候,所有的數據流會經過clean()這個函數

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

#在clean函數中先取出表單中的name字段,在從數據庫里面拿到所有的數據進行檢查 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

補充知識:django中關于表單自定義驗證器和常用驗證器

常用驗證器:

在驗證某個字段的時候,可以傳遞一個 validators 參數用來指定驗證器,進一步對數據進行過濾。驗證器有很多,但是很多驗證器我們其實已經通過這個 Field 或者一些參數就可以指定了。比如 EmailValidator ,我們可以通過 EmailField 來指定,比如 MaxValueValidator ,我們可以通過 max_value 參數來指定。

以下是一些常用的驗證器:

1. MaxValueValidator :驗證最大值。

2. MinValueValidator :驗證最小值。

3. MinLengthValidator :驗證最小長度。

4. MaxLengthValidator :驗證最大長度。

5. EmailValidator :驗證是否是郵箱格式。

6. URLValidator :驗證是否是 URL 格式。

7. RegexValidator :如果還需要更加復雜的驗證,那么我們可以通過正則表達式的驗證

器: RegexValidator 。比如現在要驗證手機號碼是否合格,那么我們可以通過以下代碼實

現:

class MyForm(forms.Form):

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

自定義驗證:

有時候對一個字段驗證,不是一個長度,一個正則表達式能夠寫清楚的,還需要一些其他復雜的邏輯,那么我們可以對某個字段,進行自定義的驗證。比如在注冊的表單驗證中,我們想要驗證手機號碼是否已經被注冊過了,那么這時候就需要在數據庫中進行判斷才知道。對某個字段進行自定義的驗證方式是,定義一個方法,這個方法的名字定義規則是: clean_fieldname 。如果驗證失敗,那么就拋出一個驗證錯誤。比如要驗證用戶表中手機號碼之前是否在數據庫中存在,那么可以通過以下代碼實現:

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

以上是對某個字段進行驗證,如果驗證數據的時候,需要針對多個字段進行驗證,那么可以重寫 clean 方法。比如要在注冊的時候,要判斷提交的兩個密碼是否相等。那么可以使用以下代碼來完成:

class MyForm(forms.Form):telephone = forms.CharField(validators=[validators.RegexValidator('1[345678]d{9}',message=’請輸入正確格式的手機號碼!’)])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(’兩個密碼不一致!’)

提取錯誤信息:

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

1. form.errors :這個屬性獲取的錯誤信息是一個包含了 html 標簽的錯誤信息。

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

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

4. 上述方法獲取的字段的錯誤值,都是一個比較復雜的數據。比如以下:

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

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

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

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

以上這篇Django def clean()函數對表單中的數據進行驗證操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Django
相關文章:
主站蜘蛛池模板: 福利视频午夜 | 久草免费在线色站 | 国产成人mv在线观看入口视频 | 免费福利入口在线观看 | 久久免费大片 | 国产成人精品三级 | 国产福利一区二区在线精品 | 国产美女做爰免费视频软件 | 亚洲超大尺度激情啪啪人体 | 99在线免费观看视频 | 国产精品久久久久免费视频 | 韩国主播19福利视频在线 | 6一10周岁毛片免费 6一12呦女精品 | 国产伦精品一区二区三区 | 欧美日韩精品国产一区二区 | 久久国产精品高清一区二区三区 | 99久久精彩视频 | 日本加勒比系列 | 一区国严二区亚洲三区 | 久久久久久久久久久久福利 | 午夜性色福利视频在线视频 | 欧美激情精品久久久久 | 手机在线精品视频 | 日韩专区亚洲综合久久 | 全部毛片 | 欧美成人一区二区三区在线视频 | 国产成人综合洲欧美在线 | 色综合色狠狠天天久久婷婷基地 | 欧美在线视频一区二区 | 欧美一级毛片特黄黄 | 欧洲成人r片在线观看 | 欧美在线一级精品 | 亚洲国产精品线播放 | 欧美高清在线视频在线99精品 | 亚洲图片偷拍区 | 男人天堂亚洲 | 久久.com| 美女张开腿给男人桶 | 可以看的黄网 | 欧美在线成人免费国产 | 男人的天堂欧美精品色偷偷 |