Odoo 16调用report_action()后如何自定义报表文件名?
解决Odoo 16中
.report_action()传data时自定义报表文件名失效问题 在Odoo 16中调用report_action()传递data参数时,会出现报表无法获取docids(记录ID)的情况,导致print_report_name配置中的object对象为空,自定义文件名失效,默认使用报表动作的字符串名称。
现有两种调用方式的矛盾点:
- 不传
data:报表可正常访问object生成自定义文件名,但无法传递额外业务数据 - 传
data:能传递额外数据,但object为空,自定义命名逻辑失效
解决方案
方法1:显式传入docids参数
调用report_action时手动指定docids,确保报表能获取到记录ID,无需修改报表定义:
for rec in self: return self.env.ref('inbound_route.report_inbound_pallets_list').report_action( rec, data=create_dummy_pallets_list(rec), docids=[rec.id] )
此时原报表的print_report_name配置'%s_inbound_pallets_list' % (object.name)可正常生效。
方法2:在data中嵌入记录命名字段
将用于命名的记录字段(如name)加入data对象,修改报表的print_report_name从data中取值:
调用代码修改:
for rec in self: report_data = create_dummy_pallets_list(rec) # 把记录名称存入data report_data['record_name'] = rec.name return self.env.ref('inbound_route.report_inbound_pallets_list').report_action(rec, data=report_data)
报表定义修改:
<report id="report_inbound_pallets_list" string="List of Inbound Pallets" model="stock.picking" report_type="qweb-pdf" name="inbound_route.inbound_pallets_list" file="inbound_route.inbound_pallets_list" print_report_name="'%s_inbound_pallets_list' % (data.get('record_name', 'unknown'))" />
方法3:重写报表的_get_report_values方法
通过继承报表抽象模型,确保object对象被正确传递,同时保留自定义data:
from odoo import models class ReportInboundPalletsList(models.AbstractModel): _inherit = 'report.inbound_route.inbound_pallets_list' def _get_report_values(self, docids, data=None): report_values = super()._get_report_values(docids, data=data) # 若存在docids,手动注入object对象 if docids: report_values['object'] = self.env['stock.picking'].browse(docids[0]) return report_values
该方法无需修改原报表的print_report_name配置,object.name可正常使用。
内容的提问来源于stack exchange,提问作者jeremy k
相关产品推荐
相关产品推荐

