全局和局部钩子
FORMS-钩子
1. 钩子函数的含义其实就是在程序的执行过程中穿插额外的逻辑。
1.局部钩子
eg:校验用户名是否已存在
def clean_name(self): # 自动生成的函数名 专门用于对name字段添加额外的校验规则
name = self.cleaned_data.get('name') # 1.先获取用户名
is_exist = models.User.objects.filter(name=name) # 2.判断用户名是否已存在
if is_exist:
self.add_error('name', '用户名已存在') # 3.提示信息
return name # 4.最后将你勾上来的name返回回去
2.全局钩子
eg:校验密码与确认密码是否一致
def clean(self):
password = self.cleaned_data.get('password') # 1.获取多个字段数据
confirm_password = self.cleaned_data.get('confirm_password')
if not password == confirm_password:
self.add_error('confirm_password', '两次密码不一致 你个傻帽!!!')
return self.cleaned_data # 最后将整个数据返回
DRF-钩子
1. 无论新增还是修改,只要执行ser.is_valid()就会触发校验。
2. 校验步骤:先根据字段(fields = ['',''])自己的校验规则进行校验---->然后model.py 中字段django自己的规则进行校验--->再走局部钩子--->再走全局钩子。
(1)写在序列化类中的局部钩子函数,校验单个字段。
(2)写在序列化类中的全局钩子函数,校验所有字段。
gyan #### 1.局部钩子eg:校验书名不能以ab开头, forms组件没有,validate有
def validate_name(self,name):
if name.startswith('ab'): # name就是 要校验的字段对应的前端传入的值
raise ValidationError('不能以ab开头') # 校验失败,抛异常
else:
return name
2.全局钩子
eg:
def validate(self, attrs):
# attrs 校验过后的数据--->字段自己校验完后,局部钩子走完过的数据
name=attrs.get('name')
price=attrs.get('price')
# 加判断,如果通过,就返回attrs
# 如果不通过就抛异常
if name == price:
raise ValidationError('名字和价格不能一样')
else:
return attrs