一 简介 我们来聊聊如何构建forms的钩子
二 目的 实现自定义的验证机制,从而进行处理
三 分类:
1 局部钩子 clean_column() 当字段校验完毕后,再进行查找是否有以clean_开头的函数名,如果有,就调用该函数
2 全局钩子 clean() 其原理是对校验完毕的字段,再进行字段间的校验。当字段校验完毕,查找是否有clean的函数,如果有就运行该函数
执行顺序 局部钩子 全局钩子
三 基本语法
from django.core.exceptions import ValidationError,NON_FIELD_ERRORS
delf clean_column(self):
value=self.cleaned_data.get('key')
if true:
return value
else:
raise ValidationError()
四 重写clean()方法
clean()方法预定义没处理流程,只返回cleaned_data
五 注意
1 单个字段只能指定单个方法
2 钩子是按照顺序执行的,如果上面的不过,直接抛出异常了.不会执行下面的钩子
3 clean()的优先级最高
六 场景示例
1 存在用户就不允许再插入(局部钩子)
def clean_user(self):
user1=self.cleaned_data.get("user")
val=User.objects.filter(user=user1)
if not val:
return val
else:
raise ValidationError("用户名已存在")
错误根据{{field.errors}} 即可显示
2 密码和二次密码输入的确认(全局钩子)
def clean(self):
pwd=self.cleaned_data.get("password")
pwd1=self.cleaned_data.get("password_1")
if pwd==pwd1:
return self.cleaned_data
else:
raise ValidationError("两次密码不一致")
views函数
g_error=form.errors.get("__all__")#通过这种方式取得全局钩子报错信息
前端
{% if filed.label == "确认密码" %}
{{ g_error }}
{% endif %}