局部鉤子:django
在Fom類中定義 clean_字段名() 方法,就可以實現對特定字段進行校驗。(校驗函數正常必須返回當前字段值)函數
def clean_name(self):ui
passspa
name = self.cleaned_data.get('name')orm
if name=='admin':對象
raise ValidationError('admin是超級管理員,不能註冊!')#這個錯誤會直接扔進該字段的錯誤類別中:name.errorsget
return self.cleaned_data.get('name')it
在Fom類中定義 clean() 方法,就可以實現對字段進行全局校驗,字段所有驗證完,局部鉤子也所有執行完以後,io
執行這個全局鉤子校驗(校驗函數正常必須返回當前對象的結果值)。鉤子
# 全局鉤子
def clean(self):
register_dict = self.cleaned_data
print('>>>>>', register_dict)
if register_dict.get('password') != register_dict.get('r_password'):
raise ValidationError('密碼不一致!')#因爲是在全局非字段內校驗,這個錯誤會扔給全局對象self中:self.erors
self.add_error('r_password', '兩次密碼不一致!')#能夠使用對象的add_error('字段','錯誤提示')進行指定
else:
return self.cleaned_data
from django import forms
from django.core.exceptions import ValidationError
class Registerform(forms.Form):
name = forms.CharField(
label='用戶名:',
# required=True,
max_length=10,
min_length=6,
help_text='只能由字符數字下劃線組成,長度在6到10個字符', # 提示信息
# initial='只能由字符數字下劃線組成',#默認值
error_messages={'required': '*必填項',
'max_length': '長度不能超過10',
'min_length': '至少6個字符', },
)
password = forms.CharField(
label='密碼:',
max_length=12,
min_length=6,
error_messages={'required': '*必填項',
'max_length': '長度不能超過12',
'min_length': '至少6個字符', },
# widget=forms.widgets.PasswordInput(attrs={'class': 'form-control'},render_value=True),
widget=forms.PasswordInput(attrs={'class': 'form-control'}, render_value=True),
)
r_password = forms.CharField(
label='確認密碼:',
max_length=12,
min_length=6,
error_messages={'required': '*必填項',
'max_length': '長度不能超過12',
'min_length': '至少6個字符', },
widget=forms.widgets.PasswordInput(attrs={'type':'password'},render_value=True)#密碼驗證出錯時直接返回會自動清除內容,若是要保留,需設置render_value=True
)
def __init__(self, *args, **kwargs):
super(Registerform, self).__init__(*args, **kwargs)
# print(self.fields)
for filed in self.fields:
print('>>>>', filed)
self.fields[filed].widget.attrs.update({'class': 'form-control'})
# 局部鉤子
def clean_name(self):
pass
name = self.cleaned_data.get('name')
if name=='admin':
raise ValidationError('admin是超級管理員,不能註冊!')#這個錯誤會直接扔進該字段的錯誤類別中:name.errors
return self.cleaned_data.get('name')
def clean_password(self):
pass
return self.cleaned_data.get('password')
def clean_r_password(self):
pass
return self.cleaned_data.get('r_password')
# 全局鉤子
def clean(self):
register_dict = self.cleaned_data
print('>>>>>', register_dict)
if register_dict.get('password') != register_dict.get('r_password'):
raise ValidationError('密碼不一致!')#因爲是在全局非字段內校驗,這個錯誤會扔給全局對象self中:self.erors
self.add_error('r_password', '兩次密碼不一致!')#能夠使用對象的add_error('字段','錯誤提示')進行指定
else:
return self.cleaned_data