Django之Hook函数

Django之钩子Hook方法

局部钩子:

在Fom类中定义 clean_字段名() 方法,就能够实现对特定字段进行校验。(校验函数正常必须返回当前字段值)

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')

全局钩子:

在Fom类中定义 clean() 方法,就能够实现对字段进行全局校验,字段全部验证完,局部钩子也全部执行完之后,

执行这个全局钩子校验(校验函数正常必须返回当前对象的结果值)。

全局钩子

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

posted @ 2019-12-05 12:30  南歌先生  阅读(361)  评论(0)    收藏  举报