使用Field
能夠是對數據驗證的第一步。你指望這個提交上來的數據是什麼類型,那麼就使用什麼類型的Field
。javascript
用來接收文本。
參數:
max_length
:這個字段值的最大長度。
min_length
:這個字段值的最小長度。
required
:這個字段是不是必須的。默認是必須的。
error_messages
:在某個條件驗證失敗的時候,給出錯誤信息。html
用來接收郵件,會自動驗證郵件是否合法。
錯誤信息的key:required
、invalid
。前端
用來接收浮點類型,而且若是驗證經過後,會將這個字段的值轉換爲浮點類型。
參數:
max_value
:最大的值。
min_value
:最小的值。
錯誤信息的key:required
、invalid
、max_value
、min_value
。java
用來接收整形,而且驗證經過後,會將這個字段的值轉換爲整形。
參數:
max_value
:最大的值。
min_value
:最小的值。
錯誤信息的key:required、invalid、max_value、min_value。python
用來接收url格式的字符串。
錯誤信息的key:required
、invalid
。ios
在驗證某個字段的時候,能夠傳遞一個validators
參數用來指定驗證器,進一步對數據進行過濾。驗證器有不少,可是不少驗證器咱們其實已經經過這個Field
或者一些參數就能夠指定了。好比EmailValidator
,咱們能夠經過EmailField
來指定,好比MaxValueValidator
,咱們能夠經過max_value
參數來指定。如下是一些經常使用的驗證器:web
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("手機號碼已經存在!") return telephone
以上是對某個字段進行驗證,若是驗證數據的時候,須要針對多個字段進行驗證,那麼能夠重寫clean方法。好比要在註冊的時候,要判斷提交的兩個密碼是否相等。那麼可使用如下代碼來完成:json
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
格式的字符串,方便進行傳輸。
上述方法獲取的字段的錯誤值,都是一個比較複雜的數據。好比如下:
{'username': [{'message': 'Enter a valid URL.', 'code': 'invalid'}, {'message': 'Ensure this 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] = messages return new_errors
這樣就能夠把某個字段全部的錯誤信息直接放在這個列表中。