命名規則爲clean_對象名稱,例如上面定義了username、pwd對象,那麼能夠定義clean_username、clean_pwd的局部鉤子進行規則校驗前端
一、例子:定義一個手機號校驗的局部鉤子django
def clean_phone(self): value = self.cleaned_data.get('phone') # 沒有經過校驗規則 拋出ValidationError if not re.match(r'^1[3-9]\d{9}$',value): raise ValidationError('手機號格式不正確') # 經過校驗規則 返回當前的值 return value
二、例子:定義局部鉤子,判斷部門名稱是否已存在ui
from django import forms from crm import models class DepartForm(forms.ModelForm): class Meta: model = models.Depart fields = '__all__' error_messages = { 'depart_name': { 'required': '不能爲空', }, 'depart_desc': { 'required': '不能爲空', }, } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 批量更新class屬性 for field in self.fields.values(): field.widget.attrs.update({'class': 'form-control'}) # 定義局部鉤子,判斷部門名稱是否已存在 def clean_depart_name(self): depart_name_new = self.cleaned_data.get('depart_name', None) if not models.Depart.objects.filter(depart_name=depart_name_new).exists(): # 注意局部鉤子返回的是要校驗的這個值,全局鉤子返回的是self.cleaned_data return depart_name_new # self.add_error('depart_name', '部門名稱已存在!') raise forms.ValidationError('部門名稱已存在')
配置錯誤信息時,self.add_error和raise ValidationError這兩種方法均可以
導入方法有2種
from django.forms import ValidationError 或者 from django.core.exceptions import ValidationErrorspa
拋出異常時使用ValidationError,則錯誤信息在__all__字典中,模板中經過{{form_obj.non_field_error.0}}獲取錯誤信息
raise ValidationError('部門名稱已存在')code
若是使用self.add_error方法,則是給指定字段添加錯誤信息
self.add_error('depart_name', '部門名稱已存在')orm
編寫全局鉤子預留的clean方法,能夠獲取到多個字段並進行校驗對象
一、例子:定義一個校驗2次輸入密碼是否一致的全局鉤子blog
def clean(self): pwd = self.cleaned_data.get('pwd') re_pwd = self.cleaned_data.get('re_pwd') # 經過校驗 返回self.cleaned_data if pwd == re_pwd: return self.cleaned_data # 沒有經過校驗 拋出ValidationError # self.add_error('re_pwd','兩次密碼不一致!') raise ValidationError('兩次密碼不一致') 前端能夠經過fomr_obj.errors.__all__ 獲取到內置校驗器的所有錯誤信息 不能經過__all__來調取全局鉤子的錯誤信息,須要經過對象的non_field_errors來獲取錯誤信息列表 {{ form_obj.non_field_errors.0 }}