一 简介 我们来聊聊如何构建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 %}七 小补充
对于多余的字段不存入库,可以采用字典删除的方式入库
forms.cleaned_data.pop("column")
models.object.create(** forms.cleaned_data)