如何在Odoo报表文件中根据Tree View字段属性设置显示条件?
解决方案
要实现Tree View字段的optional属性控制QWeb报表字段的显示/隐藏,核心是先从视图定义中读取字段属性,再在报表中做条件判断,具体步骤如下:
1. 在模型中添加方法读取视图字段属性
首先通过Odoo的ir.ui.view模型获取目标Tree View的结构,解析出字段的optional属性值:
from lxml import etree from odoo import models class YourModel(models.Model): _inherit = 'your.model' # 替换为实际业务模型名 def get_field_optional_state(self, field_name, tree_view_id): """获取指定Tree View中字段的optional属性状态""" view = self.env['ir.ui.view'].browse(tree_view_id) if not view.arch: return False # 解析视图XML结构 arch_root = etree.fromstring(view.arch) # 定位目标字段节点 field_node = arch_root.xpath(f"//field[@name='{field_name}']") if field_node: # 返回该字段是否设置了optional='hide' return field_node[0].get('optional') == 'hide' return False
2. 在报表上下文预计算状态(可选但更高效)
在报表对应的Python类中,预计算字段状态,避免模板中重复查询:
from odoo import models class YourReport(models.AbstractModel): _name = 'report.your_module.your_report_template' # 替换为实际报表模板名 _inherit = 'report.report_abstract' # 若为Excel报表则替换为'report.report_xlsx.abstract' def _get_report_values(self, docids, data=None): docs = self.env['your.model'].browse(docids) # 获取目标Tree View的ID(替换为你的Tree View的XML ID) target_tree_view = self.env.ref('your_module.test_tree_view') # 为每个记录添加字段状态属性 for doc in docs: doc.test_field_is_hidden_in_tree = doc.get_field_optional_state('test', target_tree_view.id) return { 'doc_ids': docids, 'doc_model': 'your.model', 'docs': docs, }
3. 在QWeb报表模板中添加条件判断
根据需求选择对应的判断逻辑:
需求逻辑:字段带optional='hide'则报表隐藏,否则显示
<t t-if="not doc.test_field_is_hidden_in_tree"> <span t-out="doc.test"/> </t>
你的预期逻辑:Tree View设置字段隐藏(optional='hide')时,报表显示
<t t-if="doc.test_field_is_hidden_in_tree"> <span t-out="doc.test"/> </t>
内容的提问来源于stack exchange,提问作者Ahmed Hamed
相关产品推荐
相关产品推荐

