【20.4】Django框架Form组件之钩子函数(Hook)
【一】什么是钩子函数
- 在forms组件中
- 钩子函数(Hooks)是用来在特定事件发生时执行自定义逻辑的函数。
- 它们提供了一种创建交互性和动态行为的方式,并可以用于处理表单的各种状态和数据。
【二】常见的钩子函数
【1】onInputChange
- 当输入框的值发生变化时触发。
- 你可以通过这个钩子函数获取最新的输入值,并进行相应的处理。
【2】onSubmit
- 当表单提交时触发。你可以在这个钩子函数中获取表单中的所有字段值,并进行数据验证、提交或其他操作。
【3】onBlur
- 当输入框失去焦点时触发。
- 你可以在这个钩子函数中执行验证操作
- 例如检查输入是否符合预期的格式或是否满足某些条件。
【4】onFocus
- 当输入框获得焦点时触发。
- 你可以在这个钩子函数中执行一些针对输入框焦点状态的逻辑操作
- 例如显示一个下拉列表或提示信息。
【5】onReset
- 当表单重置时触发。
- 你可以在这个钩子函数中对表单进行一些初始化操作
- 将表单恢复到初始状态。
【6】全局钩子和局部钩子
-
除了上述常见的钩子函数外,不同的forms组件可能还有其它特定的钩子函数,用于处理更具体的需求。
-
在使用特定的forms组件之前,建议查阅相应的文档或官方手册,以了解可用的钩子函数及其使用方式。
-
在特定的节点自动触发完成响应动作
- 钩子函数在forms组件中就类似于第二道关卡,能够让我们自定义校验规则
-
在forms组件中有两类钩子
-
局部钩子
- 当需要给某个字段增加校验规则的时候使用
- 在自定义的 forms 类中添加类方法即可
-
全局钩子
- 当需要给多个字段增加校验规则的时候使用
- 在自定义的 forms 类中添加类方法即可
- 当需要给多个字段增加校验规则的时候使用
-
【三】案例
【1】校验用户名中不能含有 666
- 只需要校验 username 字段 --- 局部钩子
# 定义form类
class MyForm(forms.Form):
# username : 字符串类型 最小三位,最大八位
username = forms.CharField(max_length=8, min_length=3, label="用户名",
error_messages={
"max_length": "最大八位",
"min_length": "最小三位",
"required": "必填字段",
})
# # password : 字符串类型 最小三位,最大八位 : 字符串类型 最小三位,最大八位
password = forms.CharField(max_length=8, min_length=3, label="密码",
error_messages={
"max_length": "最大八位",
"min_length": "最小三位",
"required": "必填字段",
})
# confirm_password : 字符串类型 最小三位,最大八位 : 字符串类型 最小三位,最大八位
confirm_password = forms.CharField(max_length=8, min_length=3, label="确认密码",
error_messages={
"max_length": "最大八位",
"min_length": "最小三位",
"required": "必填字段",
})
# email : 必须符合邮箱格式 xxx@xx.com
email = forms.EmailField(label="邮箱",
error_messages={
"invalid": "格式不正确",
"required": "必填字段",
})
# 钩子函数
# 局部钩子
def clean_username(self):
# 获取到用户名
username = self.cleaned_data.get("username")
if "666" in username:
# 提示给前端错误信息
self.add_error("username", "用户名不能包含敏感词")
# 将钩子勾出来的数据再放回到原来的逻辑中
return username
【2】校验密码和确认密码是否一致
- 需要校验 password 和 confirm_password 两个字段 --- 全局钩子
# 定义form类
class MyForm(forms.Form):
# username : 字符串类型 最小三位,最大八位
username = forms.CharField(max_length=8, min_length=3, label="用户名",
error_messages={
"max_length": "最大八位",
"min_length": "最小三位",
"required": "必填字段",
})
# # password : 字符串类型 最小三位,最大八位 : 字符串类型 最小三位,最大八位
password = forms.CharField(max_length=8, min_length=3, label="密码",
error_messages={
"max_length": "最大八位",
"min_length": "最小三位",
"required": "必填字段",
})
# confirm_password : 字符串类型 最小三位,最大八位 : 字符串类型 最小三位,最大八位
confirm_password = forms.CharField(max_length=8, min_length=3, label="确认密码",
error_messages={
"max_length": "最大八位",
"min_length": "最小三位",
"required": "必填字段",
})
# email : 必须符合邮箱格式 xxx@xx.com
email = forms.EmailField(label="邮箱",
error_messages={
"invalid": "格式不正确",
"required": "必填字段",
})
# 钩子函数
# 局部钩子
def clean_username(self):
# 获取到用户名
username = self.cleaned_data.get("username")
if "666" in username:
# 提示给前端错误信息
self.add_error("username", "用户名不能包含敏感词")
# 将钩子勾出来的数据再放回到原来的逻辑中
return username
# 全局钩子
def clean(self):
# 获取到需要校验的数据
password = self.cleaned_data.get("password")
confirm_password = self.cleaned_data.get("confirm_password")
# 校验参数
if password == confirm_password:
# 提示前端报错信息
self.add_error("confirm_password", "两次密码不一致")
# 将钩子勾出来的数据再放回到原来的逻辑中 --- 全部数据都被勾出来了
return self.cleaned_data
本文来自博客园,作者:Chimengmeng,转载请注明原文链接:https://www.cnblogs.com/dream-ze/p/18081778