Odoo 14如何在页面加载完成时调用指定函数
Odoo 14 页面加载完成自动执行指定函数实现方案
你之前配置的XML代码不生效的核心原因:那段<field name="code">是服务端动作(ir.actions.server)的定义内容,这类代码只会在用户主动触发对应动作(点按钮、点绑定了该动作的菜单)时才会执行,本身没有绑定页面加载的生命周期钩子,无论怎么修改这段配置都无法实现页面打开自动运行的效果。
下面分两种业务场景提供可直接落地的实现方式:
场景1:需要执行后端业务逻辑(数据初始化、配置校验、默认值生成等)
如果你的需求是打开页面时自动跑后端的Python逻辑,不要用服务端动作硬写,直接重写对应模型的生命周期方法即可。
以你提到的res.config.settings配置页为例:
- 重写模型的
get_values方法(该方法会在配置页加载、读取现有配置值时自动执行),示例代码:
class ResConfigSettings(models.TransientModel): _inherit = 'res.config.settings' @api.model def get_values(self): # 先执行原有逻辑,拿到现有配置值 res = super().get_values() # 在这里调用你需要自动执行的自定义函数 self._your_auto_run_func() return res def _your_auto_run_func(self): # 写你的自定义业务逻辑 pass
重要提示:不要在页面加载阶段直接无参调用原生
set_values()方法,该方法是用户点击「保存」按钮时将配置写入数据库的入口,页面加载阶段无参调用会把现有配置覆盖为默认值,造成配置数据异常。
如果是普通模型(非设置向导类的TransientModel)的表单页,可以重写模型的read方法,增加对应判断逻辑,避免每次读取记录都重复执行不必要的操作。
场景2:需要执行前端逻辑(DOM调整、交互提示、前端事件绑定等)
如果你的需求是页面前端渲染完成后执行JS逻辑,需要扩展Odoo14的前端视图组件,通过OWL框架的生命周期钩子触发:
- 新建自定义JS文件,存放到你的模块路径
/your_module/static/src/js/form_auto_run.js,示例代码:
odoo.define('your_module.FormAutoRun', function (require) { "use strict"; const FormController = require('web.FormController'); FormController.include({ start: function () { const self = this; return this._super.apply(this, arguments).then(function () { // 增加模型判断,只在你需要的目标页面执行逻辑,避免影响所有表单页 if (self.modelName !== 'res.config.settings') { return; } // 这里写你要在页面加载完成后执行的前端逻辑 console.log('页面加载完成,执行自定义逻辑'); // 如果需要调用后端Python方法,用_rpc发起请求即可 self._rpc({ model: 'res.config.settings', method: '_your_auto_run_func', args: [[]], }) }); }, }); });
- 在模块的XML配置里把JS文件加入后端资源加载列表:
<odoo> <template id="assets_auto_run" inherit_id="web.assets_backend"> <xpath expr="." position="inside"> <script type="text/javascript" src="/your_module/static/src/js/form_auto_run.js"></script> </xpath> </template> </odoo>
- 升级模块后,刷新浏览器缓存即可生效。
内容的提问来源于stack exchange,提问作者arleite
相关产品推荐
相关产品推荐

