ODOO10 CE自定义PDF报表命名异常:print_report_name字段失效求助
解决Odoo 10 CE自定义PDF报表文件名不生效的问题
你遇到的这个问题,核心原因大多是XML配置冲突或者字段值格式不符合Odoo要求,下面给你两种可行的解决方案:
方案1:修正XML配置(推荐)
Odoo的<report>标签本身会自动生成对应的ir.actions.report.xml记录,你额外手动定义了同名id的记录,很容易导致配置被覆盖或不生效。直接把print_report_name属性加到<report>标签里即可,注意要把文件名用单引号包裹(因为Odoo会把该字段解析为表达式):
<report id="action_report_as" model="report_as" string="Report AS_EE" report_type="qweb-pdf" name="report_as_ee.report_as" paperformat="report.vertical_1" print_report_name="'mycorrectreportname.pdf'" />
如果需要根据记录动态生成文件名(比如用记录的名称),可以这样写:
print_report_name="'Report_' + object.name + '.pdf'"
记得删除你之前单独定义的<record id="action_report_as" model="ir.actions.report.xml">块,避免配置冲突。
方案2:在Python代码中重写文件名方法
如果XML配置还是不生效,你可以在报表的AbstractModel类中重写_get_report_filename方法,直接指定文件名:
class ReportAs(models.AbstractModel): _name = 'report.report_as_ee.report_as' @api.model def render_html(self, docids, data=None): # 你的原有代码 self.model = self.env.context.get('active_model') docs = self.env[self.model].browse(self.env.context.get('active_id')) as_records = [] # 填充as_records的代码 docargs = { 'doc_ids': self.ids, 'doc_model': self.model, 'docs': docs, 'time': time, 'as': as_records } return self.env['report'].render('report_as_ee.report_as', docargs) # 新增方法:自定义报表文件名 @api.model def _get_report_filename(self, docids, data): # 返回固定文件名 return "mycorrectreportname.pdf" # 若要动态生成,可根据docids获取对应记录: # record = self.env[self.model].browse(docids[0]) # return f"Report_{record.name}.pdf"
为什么之前的配置不生效?
你手动创建了ir.actions.report.xml记录,但<report>标签已经自动生成了一条相同id的记录,Odoo加载配置时会出现覆盖或优先级问题,导致你自定义的print_report_name不被读取。另外,print_report_name字段需要是可解析的表达式,直接写字符串而不用单引号包裹的话,Odoo会把它当作字段名或变量,而非字面量字符串,这也会导致配置失效。
内容的提问来源于stack exchange,提问作者Joseph Vahde




