欢迎访问Odoo亚太地区金牌服务机构·开源智造(OSCG)    400-900-4680  sales@oscg.cn 
Language/语言  简体中文       English       
如何在 Odoo 开发中使用 Hooks?

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的指南,您的模块结构将如下所示,

how-to-use-hooks-in-odoo-development

下面我们来详细看看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。

首先,您需要编写一个清单文件,如下所示,

how-to-use-hooks-in-odoo-development

然后你必须在模块内的 hooks.py 文件和 __init__.py 中编写函数定义,如下所示

how-to-use-hooks-in-odoo-development

在 hooks.py 文件中,使用清单中提供的名称定义 pre_init_hook 函数,

how-to-use-hooks-in-odoo-development

你可以在他们的.module.module 中注册模块的逻辑之前使用这个Hook。Pre_init_hook 通常用于检查模块的兼容性。通过使用 pre_init_hook,我们可以对数据库进行一些修改,为模块安装做好准备。

Post Init Hook

这些是在模块安装后立即执行的功能。post_init_hook 函数的参数是数据库游标和注册表。

您可以按如下方式定义 post_init_function。 

在您的清单文件中 

how-to-use-hooks-in-odoo-development

在您的__init__.py文件中导入 post_init_hook函数并按如下方式定义该函数。

how-to-use-hooks-in-odoo-development

在  hooks.py文件中定义如下函数,

how-to-use-hooks-in-odoo-development

您可以使用 post_init_function 在数据库内部执行一些操作以完成模块安装。

uninstall_hook

该函数在模块卸载后立即执行,卸载Hooks的参数是数据库游标和注册表。

您可以按如下方式定义uninstall_hook 函数。

在您的清单文件中。

how-to-use-hooks-in-odoo-development

在您的__init__.py文件中导入 uninstall_hook 函数并在hooks.py文件中定义该函数,如下所示。

how-to-use-hooks-in-odoo-development

在 hooks.py 文件中定义卸载hooks,如下所示,

how-to-use-hooks-in-odoo-development

您可以使用uninstall_hook功能来完成模块的卸载过程,或者清理一些记录,以防无法通过API

Post Load

根据odoo的推荐,post_load是为了,

“调用模块post-load hook这可以在初始化任何模型或#data 之前完成。这是可以的,因为post-load hook 用于#server-wide(而不是registry-specific)功能。”

通常这些函数用于monkey patch

Monkey Patches:是在运行时对已有的代码进行修改,我们可以在运行时更改函数或代码的行为以获得所需的输出。

 例如:

how-to-use-hooks-in-odoo-development

使用 post_load 进行monkey patch的原因是,否则每次在路径中可用时都会应用monkey patch通过使用 post_load,只有在安装了相应的模块时才会应用一次。


你可以定义 post_load 如下,在模块的清单文件中添加 post_load 函数名称,

how-to-use-hooks-in-odoo-development

在 __init__.py 文件中导入 post_load 函数,并在 hooks.py 文件中定义函数,如下所示。

how-to-use-hooks-in-odoo-development

how-to-use-hooks-in-odoo-development

您可以像上面一样使用 post_load,只要安装了模块,就会应用 post_load。


重塑生产制造业
MRP+MES+维护+PLM+质检+库存+采购