【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
posted @ 2024-03-18 23:20  Chimengmeng  阅读(42)  评论(0编辑  收藏  举报
/* */