You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,让它读取向导模型的字段生成文件名:

  1. 修改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>
  1. 向导的print_report方法保持原有调用逻辑即可。

方案二:通过上下文传递自定义文件名(更灵活)

如果需要动态生成文件名(比如结合项目名称、日期等),可以在向导中生成文件名并传入上下文,再让报表动作读取上下文值:

  1. 修改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)  
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 13:14:53