Odoo11自定义模块覆盖PivotRenderer的_render方法不生效如何解决
问题原因
你的实现逻辑核心存在1处明显错误,同时可能伴随模块配置问题,导致修改不生效:
1. 核心逻辑错误
你重写_render方法完成自定义渲染后,又调用了return this._super.apply(this, arguments);,父类原生的_render方法会重新执行一遍,直接覆盖你前面所有的DOM修改。你直接修改官方web模块的源代码时应该是去掉了这行调用,所以能生效。
2. 可能的配置错误
如果修复上述问题后仍不生效,基本是模块静态资源加载配置错误导致的。
解决步骤
第一步:修复JS代码
删除_render方法末尾的return this._super.apply(this, arguments);即可,你已经完成了完整的渲染逻辑,不需要再执行父类方法。
如果你只是需要给thead加自定义类,完全不需要重写整个_render方法,更轻量的实现方式如下,兼容性更好也不容易出错:
odoo.define('MY_CUSTOM_MODULE_NAME.renderer', function (require) { "use strict"; var PivotRenderer = require('web.PivotRenderer'); PivotRenderer.include({ _render: function () { var def = this._super.apply(this, arguments); // 原生渲染完成后,直接给thead加类 this.$el.find('thead').addClass("CLASS_NAME"); return def; } }); });
第二步:检查模块配置
打开自定义模块的__manifest__.py文件,确认以下配置:
depends字段必须包含web,确保你的模块在web模块加载完成后再加载:'depends': ['web'],assets字段的web.assets_backend列表中,正确注册你的JS文件,路径和实际存放路径一致:
注意'assets': { 'web.assets_backend': [ 'MY_CUSTOM_MODULE_NAME/static/src/js/你的JS文件名.js', ], }MY_CUSTOM_MODULE_NAME必须和你的模块技术名称完全一致,大小写敏感。
第三步:清理缓存测试
- 升级你的自定义模块
- 访问Odoo时地址栏添加
?debug=assets强制重新加载所有静态资源 - 清理浏览器缓存,或使用隐身窗口测试
内容的提问来源于stack exchange,提问作者Gautam Bothra
相关产品推荐
相关产品推荐

