Odoo 16中One2many树形视图行按字段值着色问题求助
Odoo 16 One2many树形视图行背景色根据字段值设置解决方案
针对你遇到的问题,以下是两种经过验证的适配Odoo 16的解决方案:
方法一:使用视图row_class属性(推荐)
Odoo 16支持在树形视图的<tree>标签中直接配置row_class属性,通过表达式绑定条件样式,无需复杂JS开发。
修改视图XML配置
在你的One2many字段对应的树形视图定义中,添加row_class属性,并确保is_line_nonsense字段被包含(即使设为不可见):<field name="your_one2many_field_name"> <tree editable="bottom" row_class="o-red-highlight-row: is_line_nonsense"> <field name="is_line_nonsense" invisible="1"/> <!-- 其他业务字段 --> </tree> </field>语法说明:
row_class的值为CSS类名: 条件表达式,多个条件用逗号分隔。这里直接用is_line_nonsense作为条件,因为它是布尔字段,值为True时自动匹配。添加自定义CSS样式
在模块的static/src/css目录下创建list_row_styles.css文件,写入样式:.o-red-highlight-row { background-color: #ff4d4d !important; color: white !important; /* 可选:调整文字颜色提升可读性 */ }然后在模块的
__manifest__.py中注册这个CSS资源:'assets': { 'web.assets_backend': [ 'your_module_name/static/src/css/list_row_styles.css', ], },
方法二:通过JS扩展ListRenderer
如果方法一不生效(比如特殊视图场景),可以通过正确的JS继承方式扩展ListRenderer,修复你之前的无效问题。
编写JS扩展文件
在模块的static/src/js目录下创建list_renderer_patch.js:import ListRenderer from 'web.ListRenderer'; import patch from 'web.patch'; patch(ListRenderer.prototype, 'your_module_name.ListRendererPatch', { _renderRow(record) { // 调用父类方法渲染行 const $row = this._super(...arguments); // 检查字段值,注意确保字段已被视图加载 if (record.data.is_line_nonsense) { $row.addClass('o-red-highlight-row'); } return $row; }, });注意:Odoo 16中推荐使用
web.patch来扩展现有组件原型,而非旧的继承方式。注册JS和CSS资源
在__manifest__.py中同时引入JS和CSS文件:'assets': { 'web.assets_backend': [ 'your_module_name/static/src/js/list_renderer_patch.js', 'your_module_name/static/src/css/list_row_styles.css', ], },
关键注意事项
- 必须确保
is_line_nonsense字段被包含在树形视图的字段列表中,即使设置invisible="1"也可以,否则JS或视图表达式无法获取到该字段的值。 - 完成配置后,在开发者模式下升级模块,并清除浏览器缓存(Ctrl+Shift+R强制刷新),确保新资源加载生效。
- 如果使用自定义模块,确认模块已安装并启用。
内容的提问来源于stack exchange,提问作者chrineuh
相关产品推荐
相关产品推荐

