Odoo15中扩展继承form_view.js时extend/include不生效如何解决
Odoo15 扩展FormRenderingEngine的process_group方法不生效解决方案
扩展不生效的核心原因有三点:
- 自定义JS模块未将扩展后的类注册回Odoo表单视图体系,单纯调用
extend生成的新类不会自动替换框架内原有类的引用 - Odoo15中
FormRenderingEngine是FormRenderer的内部依赖,并非可直接替换的全局公共类,未重新绑定的情况下FormRenderer仍会调用原生未修改的渲染引擎 - 你写的扩展代码存在语法错误:末尾多写了一个闭合花括号,且未调用原生
_super方法,会直接打断原有表单渲染流程
正确实现方式
1. 编写自定义扩展JS
不要直接返回extend生成的新类,通过include方法给原生类打补丁,同时将重写后的渲染引擎重新绑定到FormRenderer上,代码示例如下:
odoo.define('your_custom_module.CustomFormRenderPatch', function (require) { "use strict"; // 引入所需依赖 const FormRenderingEngine = require('web.FormRenderingEngine'); const FormRenderer = require('web.FormRenderer'); // 重写process_group方法 FormRenderingEngine.include({ process_group: function ($group) { // 优先执行原生逻辑,避免破坏原有渲染流程 const originResult = this._super.apply(this, arguments); // 此处写入自定义业务逻辑 console.log('自定义process_group逻辑触发', $group); return originResult; } }); // 关键操作:将重写后的渲染引擎绑定到FormRenderer实例,否则扩展不会被调用 FormRenderer.include({ init: function () { this._super.apply(this, arguments); this.renderingEngine = new FormRenderingEngine(this); } }); });
2. 正确加载JS资源
将上述JS文件存放到自定义模块的静态资源路径下,例如your_custom_module/static/src/js/form_render_patch.js,随后在模块的__manifest__.py中配置资源加载,确保该文件在web模块原生form_view.js之后加载:
'assets': { 'web.assets_backend': [ 'your_custom_module/static/src/js/form_render_patch.js', ], },
同时确认__manifest__.py的依赖列表中包含web模块,保证原生资源提前加载。
3. 生效验证注意事项
- 核心组件重写必须使用
include打补丁,extend方法用于创建新的子类,不会修改原生类的行为 - 重写实例方法时必须调用
this._super.apply(this, arguments)执行原有逻辑,否则会导致表单分组渲染完全崩溃 - 模块升级后必须清空浏览器缓存、重启Odoo服务,静态JS资源的浏览器缓存是修改不生效的常见诱因
内容的提问来源于stack exchange,提问作者kinjal birare
相关产品推荐
相关产品推荐

