Hooks是在现有代码之前、之后或代替现有代码执行的函数。在Odoo中Hooks是在模块的 __init__.py 中定义的函数的字符串表示。
在odoo中Hooks中有以下类型:
1. pre_init_hook
2. post_init_hook
3.uninstall_hook
4. post_load
Hooks是在模块内的 __manifest__.py 文件中使用上述关键字定义的,如下所示。
{'pre_init_hook': 'test_pre_init_hook',
'post_init_hook': 'test_post_init_hook',
'uninstall_hook': 'test_uninstall_hook',
'post_load': 'test_post_load',
}
处理Hooks的清单值位置中的字符串是在 __init__.py 文件中定义的函数名称
根据 OCA 指南,Hooks函数应该放在 hooks.py 文件中,该文件位于模块目录的根目录中。还记得在 __init__.py 文件中添加并导入如下,
from .hooks import pre_init_hook, post_init_hook, uninstall_hook, post_loa
如果您遵循 OCA 使用Hooks的指南,您的模块结构将如下所示,
下面我们来详细看看Hooks怎么写,每个Hook在Odoo中的作用是什么。
Pre Init Hooks
Pre Init Hooks 是在模块安装之前执行的Hook函数。如果我们在一个模块中定义了一个 pre_init_hook,那么只要用户点击那个模块的安装按钮,这个Hook函数就会被执行。pre_init_hook 函数将在模块安装之前被调用并执行一些操作。
pre_init_hook 将游标作为其唯一参数,例如,您可以如下定义 pre_init_function。
您可以按如下方式定义 pre_init_function。
首先,您需要编写一个清单文件,如下所示,
然后你必须在模块内的 hooks.py 文件和 __init__.py 中编写函数定义,如下所示
在 hooks.py 文件中,使用清单中提供的名称定义 pre_init_hook 函数,
你可以在他们的.module.module 中注册模块的逻辑之前使用这个Hook。Pre_init_hook 通常用于检查模块的兼容性。通过使用 pre_init_hook,我们可以对数据库进行一些修改,为模块安装做好准备。
Post Init Hook
这些是在模块安装后立即执行的功能。post_init_hook 函数的参数是数据库游标和注册表。
您可以按如下方式定义 post_init_function。
在您的清单文件中
在您的__init__.py文件中导入 post_init_hook函数并按如下方式定义该函数。
在 hooks.py文件中定义如下函数,
您可以使用 post_init_function 在数据库内部执行一些操作以完成模块安装。
uninstall_hook
该函数在模块卸载后立即执行,卸载Hooks的参数是数据库游标和注册表。
您可以按如下方式定义uninstall_hook 函数。
在您的清单文件中。
在您的__init__.py文件中导入 uninstall_hook 函数并在hooks.py文件中定义该函数,如下所示。
在 hooks.py 文件中定义卸载hooks,如下所示,
您可以使用uninstall_hook功能来完成模块的卸载过程,或者清理一些记录,以防无法通过API
Post Load
根据odoo的推荐,post_load是为了,
“调用模块post-load hook。这可以在初始化任何模型或#data 之前完成。这是可以的,因为post-load hook 用于#server-wide(而不是registry-specific)功能。”
通常这些函数用于monkey patch。
Monkey Patches:是指在运行时对已有的代码进行修改,我们可以在运行时更改函数或代码的行为以获得所需的输出。
例如:
使用 post_load 进行monkey patch的原因是,否则每次在路径中可用时都会应用monkey patch。通过使用 post_load,只有在安装了相应的模块时才会应用一次。
你可以定义 post_load 如下,在模块的清单文件中添加 post_load 函数名称,
在 __init__.py 文件中导入 post_load 函数,并在 hooks.py 文件中定义函数,如下所示。
您可以像上面一样使用 post_load,只要安装了模块,就会应用 post_load。