全局和局部钩子

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
posted @ 2023-04-03 19:51  codegjj  阅读(29)  评论(0编辑  收藏  举报