定义
有时,业务用例非常复杂,无法通过使用数据文件来进行解决。这些情况下,可以在声明文件中使用init钩子来执行所需要的操作。
使用方法
按照如下步骤来添加post_init_hook:
在__manifest__.py文件中通过post_init_hook键来注册这个钩子:
...
'post_init_hook': 'add_book_hook',
...
如图:
在__init__.py文件中添加add_book_hook()方法:
def add_book_hook(cr, registry):
env = api.Environment(cr, SUPERUSER_ID, {})
book_data1 = {'name': 'Book 1', 'date_release': fields.Date.today()}
book_data2 = {'name': 'Book 2', 'date_release': fields.Date.today()}
env['library.book'].create([book_data1, book_data2])
运行原理…
在第1步中,我们在声明文件文件中通过add_book_hook值注册了post_init_hook。这表示在模块安装之后,Odoo会在__init__.py中查找add_book_hook方法。如果找到,它会使用数据库游标和 registry调用该方法。
第2步中,我们声明了add_book_hook()方法,在模块安装后会被调用。我们通过该方法创建了两条记录。在实际情况中,可以在本息编写复杂的业务逻辑。
本例中,我们学习了post_init_hook,但Odoo还支持另外两种钩子:
pre_init_hook:这个钩子会在开始安装模块时触发。它与post_init_hook正好相反,会在当前模块安装前触发。
uninstall_hook:这个钩子会在你卸载该模块时触发。它多用于模块需要垃圾回收机制时。