视频加载失败

Django框架Form组件之钩子函数(Hook)

1195 字
6 分钟
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

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Django框架Form组件之钩子函数(Hook)
https://firefly.cuteleaf.cn/posts/framework/python/django/base/204django框架form组件之钩子函数hook/
作者
Dream
发布于
2023-07-22
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Dream
Hello, I'm Dream.
公告
欢迎来到我的博客!爱学习爱进步。
分类
标签
最新动态
站点统计
文章
300
分类
5
标签
26
总字数
640,882
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Vercel
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录