Odoo技术求助:如何修改透视表筛选器的分组显示值?
透视表分组标签自定义为区间格式解决方案
针对你遇到的透视表分组标签从数字0/1/2改为“1M - 2M”这类区间格式的问题,提供两个可行方向:
1. 后端模型重写数据处理逻辑
在你的透视表报表模型中,重写_get_report_values方法,对分组后的键值进行替换:
def _get_report_values(self, docids, data=None): res = super(YourReportModel, self)._get_report_values(docids, data=data) # 假设透视表分组数据存储在res['pivot_data']中,根据实际结构调整 if 'pivot_data' in res: # 定义数字分组到区间标签的映射 group_map = { 0: "1M - 2M", 1: "2M - 3M", 2: "3M - 4M", # 按你的分组规则补全到20对应的区间 20: "21M - 22M" } # 遍历替换分组键 for old_key in list(res['pivot_data'].keys()): if old_key in group_map: new_key = group_map[old_key] res['pivot_data'][new_key] = res['pivot_data'].pop(old_key) return res
注意:如果你的透视表数据结构不同(比如嵌套分组),需要调整遍历和替换的逻辑,确保定位到目标分组的键。
2. 前端JS修改渲染后的标签
如果后端修改无效,可通过前端JS监听透视表渲染事件,替换页面上的分组文本:
第一步:添加自定义JS资源
在模块的XML视图中引入自定义JS文件:
<template id="custom_pivot_assets" inherit_id="web.assets_backend"> <xpath expr="." position="inside"> <script type="text/javascript" src="/your_module_name/static/src/js/pivot_label_fix.js"></script> </xpath> </template>
第二步:编写JS逻辑
在pivot_label_fix.js中写入以下代码:
odoo.define('your_module_name.pivot_label_fix', function(require) { "use strict"; var PivotController = require('web.PivotController'); PivotController.include({ renderButtons: function() { this._super.apply(this, arguments); // 监听透视表头部单元格渲染 this.$el.on('DOMNodeInserted', '.o_pivot_header_cell', function() { const $cell = $(this); const originalText = $cell.text().trim(); // 定义数字到区间的映射 const labelMap = { '0': '1M - 2M', '1': '2M - 3M', // 补全所有分组对应的映射 '20': '21M - 22M' }; if (labelMap[originalText]) { $cell.text(labelMap[originalText]); } }); } }); });
关键提示
之前使用depends未生效,大概率是因为方法没有绑定到透视表数据生成的正确流程上,或者depends的字段与分组逻辑无关。优先尝试后端重写方法,若透视表是前端动态渲染的,再用JS方案。
内容的提问来源于stack exchange,提问作者Ori
相关产品推荐
相关产品推荐

