Django Form组件 基于源码的扩展
1、自定义方法,验证单独某个字段
class AjaxForm(forms.Form):
username = fields.CharField()
user_id = fields.IntegerField(
widget=(
widgets.Select(choices=[(0, '张三'), (1, '李四'), (2, '王五'), ])
)
)
# 通过源码可得,当字段通过正则验证后,会执行clean_字段名 的方法,并返回 self.cleaned_data[字段名]
# 我们可以自行定义此方法,扩展form组件,以下代码,与源码执行流程一致,只是我们重新定义了
# def clean_username(self):
# return self.cleaned_data['username'] # 必须有返回值
#
# def clean_user_id(self):
# return self.cleaned_data['user_id']
# 开始扩展,当用户名通过验证后再去验证数据库中是否有相同的用户名,如果有就发出错误信息
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError # 在源码中出错会抛出一个 ValidationError 异常
def clean_username(self):
v = self.cleaned_data['username'] # 只能取当前字段的值,不能取其它字段的值
if models.UserInfo.objects.filter(username=v).count(): 如果用户数大于0
raise ValidationError('用户名已存在')
return self.cleaned_data['username']
2、自定义方法,验证整体
class AjaxForm(forms.Form): username = fields.CharField() user_id = fields.IntegerField( widget=( widgets.Select(choices=[(0, '张三'), (1, '李四'), (2, '王五'), ]) ) ) # 通过源码可得,当字段通过正则验证后,会执行clean_字段名 的方法,并返回 self.cleaned_data[字段名] # 我们可以自行定义此方法,扩展form组件,以下代码,与源码执行流程一致,只是我们重新定义了 # def clean_username(self): # return self.cleaned_data['username'] # 必须有返回值 # # def clean_user_id(self): # return self.cleaned_data['user_id'] # 开始扩展,当用户名通过验证后再去验证数据库中是否有相同的用户名,如果有就发出错误信息 from django.core.exceptions import NON_FIELD_ERRORS, ValidationError # 在源码中出错会抛出一个 ValidationError 异常 def clean_username(self): v = self.cleaned_data['username'] # 只能取当前字段的值,不能取其它字段的值 if models.UserInfo.objects.filter(username=v).count(): 如果用户数大于0 raise ValidationError('用户名已存在') return self.cleaned_data['username']
def clean(self): # django为我们预留了这个钩子函数,当所有clean_字段名 的方法结束后,会再执行这个函数
value_dict = self.cleaned_date # 获取所有通过验证的数据
v1 = value_dict.get('username')
v2 = value_dict.get('user_id')
if v1 == 'root' and v2 == 1:
raise ValidationError('整体错误信息') # 在前端取时,用__all__来取
return self.cleaned_data
def _post_clean(self): 当clean方法执行完成后,还会再执行这个方法,我们可以重写,没有返回值,一般不用
pass