用表單驗(yàn)證數(shù)據(jù)
常用的Field:
使用Field
可以是對(duì)數(shù)據(jù)驗(yàn)證的第一步茸俭。你期望這個(gè)提交上來(lái)的數(shù)據(jù)是什么類型狠持,那么就使用什么類型的Field
合是。
CharField:
用來(lái)接收文本火窒。
參數(shù):
- max_length:這個(gè)字段值的最大長(zhǎng)度甚垦。
- min_length:這個(gè)字段值的最小長(zhǎng)度届垫。
- required:這個(gè)字段是否是必須的释液。默認(rèn)是必須的。
- error_messages:在某個(gè)條件驗(yàn)證失敗的時(shí)候装处,給出錯(cuò)誤信息误债。
EmailField:
用來(lái)接收郵件,會(huì)自動(dòng)驗(yàn)證郵件是否合法。
錯(cuò)誤信息的key:required
寝蹈、invalid
李命。
FloatField:
用來(lái)接收浮點(diǎn)類型,并且如果驗(yàn)證通過(guò)后箫老,會(huì)將這個(gè)字段的值轉(zhuǎn)換為浮點(diǎn)類型封字。
參數(shù):
- max_value:最大的值。
- min_value:最小的值槽惫。
錯(cuò)誤信息的key:required
周叮、invalid
、max_value
界斜、min_value
仿耽。
IntegerField:
用來(lái)接收整形,并且驗(yàn)證通過(guò)后各薇,會(huì)將這個(gè)字段的值轉(zhuǎn)換為整形项贺。
參數(shù):
- max_value:最大的值。
- min_value:最小的值峭判。
錯(cuò)誤信息的key:required
开缎、invalid
、max_value
林螃、min_value
奕删。
URLField:
用來(lái)接收url
格式的字符串。
錯(cuò)誤信息的key:required
疗认、invalid
完残。
常用驗(yàn)證器:
在驗(yàn)證某個(gè)字段的時(shí)候,可以傳遞一個(gè)validators
參數(shù)用來(lái)指定驗(yàn)證器横漏,進(jìn)一步對(duì)數(shù)據(jù)進(jìn)行過(guò)濾谨设。驗(yàn)證器有很多,但是很多驗(yàn)證器我們其實(shí)已經(jīng)通過(guò)這個(gè)Field
或者一些參數(shù)就可以指定了缎浇。比如EmailValidator
扎拣,我們可以通過(guò)EmailField
來(lái)指定,比如MaxValueValidator
素跺,我們可以通過(guò)max_value
參數(shù)來(lái)指定二蓝。以下是一些常用的驗(yàn)證器:
-
MaxValueValidator
:驗(yàn)證最大值。 -
MinValueValidator
:驗(yàn)證最小值指厌。 -
MinLengthValidator
:驗(yàn)證最小長(zhǎng)度刊愚。 -
MaxLengthValidator
:驗(yàn)證最大長(zhǎng)度。 -
EmailValidator
:驗(yàn)證是否是郵箱格式仑乌。 -
URLValidator
:驗(yàn)證是否是URL
格式百拓。 -
RegexValidator
:如果還需要更加復(fù)雜的驗(yàn)證,那么我們可以通過(guò)正則表達(dá)式的驗(yàn)證器:RegexValidator
晰甚。比如現(xiàn)在要驗(yàn)證手機(jī)號(hào)碼是否合格衙传,那么我們可以通過(guò)以下代碼實(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è)過(guò)了并闲,那么這時(shí)候就需要在數(shù)據(jù)庫(kù)中進(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ù)庫(kù)中存在,那么可以通過(guò)以下代碼實(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)存在九巡!")
return telephone
以上是對(duì)某個(gè)字段進(jìn)行驗(yàn)證,如果驗(yàn)證數(shù)據(jù)的時(shí)候蹂季,需要針對(duì)多個(gè)字段進(jìn)行驗(yàn)證冕广,那么可以重寫(xiě)clean
方法。比如要在注冊(cè)的時(shí)候乏盐,要判斷提交的兩個(gè)密碼是否相等佳窑。那么可以使用以下代碼來(lái)完成:
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í)候我們可以通過(guò)以下屬性來(lái)獲群瘟摺:
-
form.errors
:這個(gè)屬性獲取的錯(cuò)誤信息是一個(gè)包含了html
標(biāo)簽的錯(cuò)誤信息溉委。 -
form.errors.get_json_data()
:這個(gè)方法獲取到的是一個(gè)字典類型的錯(cuò)誤信息。將某個(gè)字段的名字作為key
爱榕,錯(cuò)誤信息作為值的一個(gè)字典瓣喊。 -
form.as_json()
:這個(gè)方法是將form.get_json_data()
返回的字典dump
成json
格式的字符串,方便進(jìn)行傳輸黔酥。 - 上述方法獲取的字段的錯(cuò)誤值藻三,都是一個(gè)比較復(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'}]}
那么如果我只想把錯(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è)列表中逗概。
看文章不過(guò)癮弟晚?還有免費(fèi)的視頻教程,讓你學(xué)起來(lái)更輕松:https://www.zhiliaoketang.cn/course/detail/4.html