最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年07月09日 16:40:25   作者:Violet-Guo  
這篇文章主要介紹了Django def clean()函數(shù)對表單中的數(shù)據(jù)進(jìn)行驗(yàn)證操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

#這是policy中的name字段,在表單的數(shù)據(jù)進(jìn)行提交的時(shí)候,所有的數(shù)據(jù)流會經(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ǔ)充知識:django中關(guān)于表單自定義驗(yàn)證器和常用驗(yàn)證器

常用驗(yàn)證器:

在驗(yàn)證某個(gè)字段的時(shí)候,可以傳遞一個(gè) validators 參數(shù)用來指定驗(yàn)證器,進(jìn)一步對數(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)證最小長度。

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

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

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

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

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

現(xiàn):

class MyForm(forms.Form):

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

自定義驗(yàn)證:

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

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

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

class MyForm(forms.Form):
  telephone = forms.CharField(validators=[validators.RegexValidator("1[345678]\d{9}",message='請輸入正確格式的手機(jī)號碼!')])
  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í)候我們可以通過以下屬性來獲?。?/p>

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] = messages
    return new_errors

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

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

相關(guān)文章

  • 使用Python進(jìn)行AES加密和解密的示例代碼

    使用Python進(jìn)行AES加密和解密的示例代碼

    這篇文章主要介紹了使用Python進(jìn)行AES加密和解密的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • Python結(jié)合WPS多維表實(shí)現(xiàn)在線批量查詞功能

    Python結(jié)合WPS多維表實(shí)現(xiàn)在線批量查詞功能

    Python是當(dāng)前人工智能時(shí)代最受歡迎的編程語言,越來越多的應(yīng)用程序把其整合到自身的功能當(dāng)中,WPS多維表就是最早接入Python代碼的應(yīng)用平臺,下面我們就來看看如何在多維表中應(yīng)用Python代碼實(shí)現(xiàn)批量單詞查詢吧
    2025-12-12
  • Python改變對象的字符串顯示的方法

    Python改變對象的字符串顯示的方法

    這篇文章主要介紹了Python改變對象的字符串顯示的方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08
  • 使用TensorFlow搭建一個(gè)全連接神經(jīng)網(wǎng)絡(luò)教程

    使用TensorFlow搭建一個(gè)全連接神經(jīng)網(wǎng)絡(luò)教程

    今天小編就為大家分享一篇使用TensorFlow搭建一個(gè)全連接神經(jīng)網(wǎng)絡(luò)教程,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • python機(jī)器學(xué)習(xí)GCN圖卷積神經(jīng)網(wǎng)絡(luò)原理解析

    python機(jī)器學(xué)習(xí)GCN圖卷積神經(jīng)網(wǎng)絡(luò)原理解析

    這篇文章主要為大家介紹了GCN圖卷積神經(jīng)網(wǎng)絡(luò)原理及代碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 使用Python讀寫文本文件及編寫簡單的文本編輯器

    使用Python讀寫文本文件及編寫簡單的文本編輯器

    這篇文章主要介紹了使用Python讀寫文本文件及編寫簡單的文本編輯器的方法,可以利用簡單的Python代碼實(shí)現(xiàn)編輯器中的讀取清空和文本文件的新建等操作,需要的朋友可以參考下
    2016-03-03
  • Python numpy.zero() 初始化矩陣實(shí)例

    Python numpy.zero() 初始化矩陣實(shí)例

    今天小編就為大家分享一篇Python numpy.zero() 初始化矩陣實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Python使用Selenium抓取動(dòng)態(tài)網(wǎng)頁的方法步驟

    Python使用Selenium抓取動(dòng)態(tài)網(wǎng)頁的方法步驟

    在如今的網(wǎng)絡(luò)中,許多網(wǎng)站是“動(dòng)態(tài)”的,即網(wǎng)頁內(nèi)容不是靜態(tài)的 HTML 文件,而是由 JavaScript 動(dòng)態(tài)生成的,這種動(dòng)態(tài)網(wǎng)頁在數(shù)據(jù)抓取中帶來了一些挑戰(zhàn),在本教程中,我們將詳細(xì)介紹如何使用 Python 抓取動(dòng)態(tài)網(wǎng)頁,需要的朋友可以參考下
    2024-11-11
  • Python中按指定數(shù)量分割列表字符串的兩種方法

    Python中按指定數(shù)量分割列表字符串的兩種方法

    處理列表數(shù)據(jù)時(shí),有時(shí)我們需要將一個(gè)包含長字符串的列表分割成按照特定長度的小字符串的多個(gè)列表,本文主要介紹了Python中按指定數(shù)量分割列表字符串,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • python+OpenCV實(shí)現(xiàn)圖像拼接

    python+OpenCV實(shí)現(xiàn)圖像拼接

    這篇文章主要為大家詳細(xì)介紹了python+OpenCV實(shí)現(xiàn)圖像拼接,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評論

小金县| 西贡区| 金阳县| 于都县| 华容县| 广宁县| 肇庆市| 仁怀市| 灵武市| 拉孜县| 湟源县| 罗平县| 桦川县| 屏东县| 丰顺县| 彰化县| 巫山县| 宝山区| 襄樊市| 紫阳县| 周口市| 体育| 大悟县| 万山特区| 松原市| 江都市| 靖西县| 济宁市| 潍坊市| 昔阳县| 敦化市| 金山区| 尚志市| 玛曲县| 岑巩县| 治县。| 崇义县| 大连市| 盐城市| 阜城县| 英超|