最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

django 用表單驗(yàn)證數(shù)據(jù)

2023-01-29 09:21 作者:app毒  | 我要投稿

常用的Field:

使用Field可以是對數(shù)據(jù)驗(yàn)證的第一步。你期望這個提交上來的數(shù)據(jù)是什么類型,那么就使用什么類型的Field。

CharField:

用來接收文本。
參數(shù):

  • max_length:這個字段值的最大長度。

  • min_length:這個字段值的最小長度。

  • required:這個字段是否是必須的。默認(rèn)是必須的。

  • error_messages:在某個條件驗(yàn)證失敗的時候,給出錯誤信息。

EmailField:

用來接收郵件,會自動驗(yàn)證郵件是否合法。
錯誤信息的key:required、invalid

FloatField:

用來接收浮點(diǎn)類型,并且如果驗(yàn)證通過后,會將這個字段的值轉(zhuǎn)換為浮點(diǎn)類型。
參數(shù):

  • max_value:最大的值。

  • min_value:最小的值。

錯誤信息的key:required、invalidmax_value、min_value。

IntegerField:

用來接收整形,并且驗(yàn)證通過后,會將這個字段的值轉(zhuǎn)換為整形。
參數(shù):

  • max_value:最大的值。

  • min_value:最小的值。

錯誤信息的key:requiredinvalid、max_valuemin_value。

URLField:

用來接收url格式的字符串。
錯誤信息的key:required、invalid。

常用驗(yàn)證器:

在驗(yàn)證某個字段的時候,可以傳遞一個validators參數(shù)用來指定驗(yàn)證器,進(jìn)一步對數(shù)據(jù)進(jìn)行過濾。驗(yàn)證器有很多,但是很多驗(yàn)證器我們其實(shí)已經(jīng)通過這個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)證:

有時候?qū)σ粋€字段驗(yàn)證,不是一個長度,一個正則表達(dá)式能夠?qū)懬宄模€需要一些其他復(fù)雜的邏輯,那么我們可以對某個字段,進(jìn)行自定義的驗(yàn)證。比如在注冊的表單驗(yàn)證中,我們想要驗(yàn)證手機(jī)號碼是否已經(jīng)被注冊過了,那么這時候就需要在數(shù)據(jù)庫中進(jìn)行判斷才知道。對某個字段進(jìn)行自定義的驗(yàn)證方式是,定義一個方法,這個方法的名字定義規(guī)則是:clean_fieldname。如果驗(yàn)證失敗,那么就拋出一個驗(yàn)證錯誤。比如要驗(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)存在!") ? ? ? ?return telephone

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

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('兩個密碼不一致!')

提取錯誤信息:

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

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

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

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

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

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

那么如果我只想把錯誤信息放在一個列表中,而不要再放在一個字典中。這時候我們可以定義一個方法,把這個數(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

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


django 用表單驗(yàn)證數(shù)據(jù)的評論 (共 條)

分享到微博請遵守國家法律
肃北| 平阴县| 辉南县| 凤山县| 孝感市| 新疆| 富顺县| 樟树市| 瑞丽市| 海淀区| 潼南县| 红河县| 昔阳县| 板桥市| 宾阳县| 溧水县| 河西区| 周至县| 交城县| 二连浩特市| 南宁市| 滕州市| 晋城| 汶川县| 深圳市| 赣州市| 阳谷县| 安新县| 阜康市| 徐州市| 汕头市| 永吉县| 普格县| 周宁县| 武胜县| 军事| 宁海县| 烟台市| 拉孜县| 宁阳县| 布尔津县|