首页 > 其他分享 >【20.4】Django框架Form组件之钩子函数(Hook)

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

时间:2024-03-18 23:37:07浏览次数:20  
标签:username 20.4 Form 钩子 八位 Django forms length password

【一】什么是钩子函数

  • 在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 : 必须符合邮箱格式  [email protected]
    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 : 必须符合邮箱格式  [email protected]
    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

标签:username,20.4,Form,钩子,八位,Django,forms,length,password
From: https://www.cnblogs.com/dream-ze/p/18081778

相关文章

  • 【20.3】Django框架Form组件之渲染错误信息
    【一】定义form组件forms.py#定义form类classMyForm(forms.Form):#username:字符串类型最小三位,最大八位username=forms.CharField(max_length=8,min_length=3,label="用户名",error_messages={......
  • 【20.7】Django表单API详解
    【一】引入声明:以下的Form、表单等术语都指的的广义的Django表单。Form要么是绑定了数据的,要么是未绑定数据的。如果是绑定的,那么它能够验证数据,并渲染表单及其数据,然后生成HTML表单。如果未绑定,则无法进行验证(因为没有数据可以验证!),但它仍然可以以HTML形式呈现空白表单。若要......
  • 【20.6】Django框架Form组件之模型表单ModelForm
    【一】引入如果你正在构建一个数据库驱动的应用,那么你可能会有与Django的模型紧密映射的表单。比如,你有个BlogComment模型,并且你还想创建一个表单让大家提交评论到这个模型中。在这种情况下,写一个forms.Form类,然后在表单类中定义字段,这种一般创建表单的做法是冗余的,因为你已经......
  • 【20.5】Django框架Form组件之源码
    【一】切入点切入点form_obj.is_valid()defis_valid(self):"""ReturnTrueiftheformhasnoerrors,orFalseotherwise."""returnself.is_boundandnotself.errors如果is_valid要想返回True那么self.is_bound要为Trueself.errors......
  • Django 用re_path()方法正则匹配复杂路由
    app1.url.pyfromdjango.urlsimportpath,re_pathfrom.importviewsurlpatterns=[path('index',views.index,name='index'),path('test',views.test,name='test'),path('test_int/<int:id>/......
  • 【20.0】Django框架之Form组件
    【一】Django的表单系统【1】使用表单(1)原始表单我们之前在HTML页面中利用form表单向后端提交数据时都会写一些获取用户输入的标签并且用form标签把它们包起来。与此同时我们在好多场景下都需要对用户的输入做校验比如校验用户是否输入输入的长度和格式等正不正确。......
  • 【10.0】Django框架之路由层
    【零】Django的路由系统【1】什么是URL配置(URLconf)URL调度器|Django文档|Django(djangoproject.com)URL配置(URLconf)就像Django所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表。你就是以这种方式告诉Django,对于这个URL调用这段代......
  • 【9.0】Django框架之生命周期流程图
    【5.0】Django框架之请求生命周期流程图解释图:浏览器>>发送请求(Http请求)>>web服务网关接口(django默认的wsgiref模块不能承受高并发,最大只有1000左右)>>中间件>>缓存数据库(返回给中间件已经缓存过的数据)>>urls.py(路由层)>>views.py(视图层)>>templates(模板......
  • 【13.0】Django框架之模型层
    【一】前言Django自带的sqlite3数据对日期格式不敏感,处理的时候容易出错【1】测试脚本测试脚本当我们只想要测试Django中的某一个py文件的内容时,我们可以不需要书写前后端交互的形式,而是直接写一个测试脚本即可测试环境的准备在测试文件中书写下面内容这内容其......
  • 【12.0】Django框架之模板层
    【零】Django模板系统模板|Django文档|Django(djangoproject.com)【一】模板语法的传值{{}}:变量相关{%%}:逻辑相关【0】变量(1)传值在Django的模板语言中按此语法使用:{{变量名}}。当模版引擎遇到一个变量,它将计算这个变量,然后用结果替换掉它本身。变......