Odoo 17中通过向导自定义PDF报表文件名问题求助
解决Odoo 17向导调用PDF报表时无法自定义文件名的问题
问题原因
当通过自定义向导调用报表时,传入报表动作的是向导模型(project.pdf.report)的记录,但原报表动作的model字段设置为抽象报表模型(report.custom_module.my_report),导致print_report_name的表达式无法正确关联到向导或业务模型的字段,最终回退使用报表动作的name字段作为文件名。而原生按钮调用时,传入的是业务模型(如project.project)的记录,与报表动作的上下文匹配,所以print_report_name能正常生效。
解决方案
以下提供两种可行的修复方案,可根据需求选择:
方案一:调整报表动作配置,关联向导模型字段
直接修改报表动作的model和print_report_name,让它读取向导模型的字段生成文件名:
- 修改
report/ir_actions_report.xml:
<?xml version="1.0" encoding="utf-8"?> <odoo> <record id="action_report_custom" model="ir.actions.report"> <field name="name">My Custom PDF</field> <!-- 修改model为向导模型 --> <field name="model">project.pdf.report</field> <field name="report_type">qweb-pdf</field> <field name="report_name">custom_module.my_report</field> <field name="report_file">custom_module.my_report</field> <!-- 使用向导的pv字段生成文件名,可自定义拼接逻辑 --> <field name="print_report_name">'PV_' + object.pv if object.pv else '默认报表名'</field> <field name="binding_type">report</field> </record> </odoo>
- 向导的
print_report方法保持原有调用逻辑即可。
方案二:通过上下文传递自定义文件名(更灵活)
如果需要动态生成文件名(比如结合项目名称、日期等),可以在向导中生成文件名并传入上下文,再让报表动作读取上下文值:
- 修改
wizard/button.py的print_report方法:
from odoo import fields, models, api, _ from itertools import groupby from operator import itemgetter import copy class CustomGenerate (models.TransientModel): _name = 'project.pdf.report' _description='Génératino du PV ' pv= fields.Char() # Export PDF def print_report(self): # 自定义文件名逻辑:结合项目名称、向导字段和日期 project_id = self.env.context.get('active_id') project = self.env['project.project'].browse(project_id) custom_file_name = f"项目PV_{project.name}_{self.pv}_{fields.Date.today()}" # 构造data,将文件名传入上下文 data = { # 保留原有data内容 'context': dict(self.env.context, custom_file_name=custom_file_name) } return self.env.ref('custom_module.action_report_custom').report_action(self, data=data)
- 修改
report/ir_actions_report.xml的print_report_name:
<field name="print_report_name">ctx.get('custom_file_name', '默认报表名')</field>
额外注意事项
- 如果报表基于项目模型数据生成,需确保报表抽象模型(
report.custom_module.my_report)的_get_report_values能通过上下文的active_id正确读取项目记录。 - 使用方案一时,需确保向导模型的目标字段(如
pv)在调用报表时已有值,避免生成空文件名。
内容的提问来源于stack exchange,提问作者Arthur Fortin
相关产品推荐
相关产品推荐

