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

Odoo14中render_qweb_pdf替代方案 生成PDF保存为附件报错解决

报错原因

Odoo14对报表渲染API做了不兼容调整,原Odoo13及更早版本可用的render_qweb_pdf方法已被废弃,这是触发'ir.actions.report' object has no attribute 'render_qweb_pdf'错误的核心原因。

Odoo14 生成PDF并保存为附件的可用代码

首先确保代码文件顶部导入依赖:

import base64

功能实现代码:

# 替换为你自己模块中定义的报表外部ID
report_obj = self.env.ref('你的模块名.你的报表ID')
# 调用Odoo14标准渲染方法,返回值第一个为PDF二进制流
pdf_data, _ = report_obj._render(self.ids)
# 转base64编码用于保存到附件
b64_pdf = base64.b64encode(pdf_data)

attachment_name = "自定义附件名称"
return self.env['ir.attachment'].create({
    'name': attachment_name,
    'type': 'binary',
    'datas': b64_pdf,
    'datas_fname': f"{attachment_name}.pdf",
    'res_model': self._name,
    'res_id': self.id,
    'mimetype': 'application/pdf'
})
核心调整说明
  • 渲染方法从render_qweb_pdf替换为_render,该方法返回两个值,第二个为渲染格式标识,无额外需求可直接用占位符_忽略
  • 移除了原代码中非必填的store_fname参数,该参数由Odoo自动维护,手动传入容易触发命名冲突
  • mimetype调整为标准application/pdf,避免部分客户端识别异常
多附件打包为ZIP扩展实现

如果需要将多个生成的PDF附件打包为ZIP,可使用以下代码:

import io
import zipfile

# 替换为你生成的所有附件对象列表
attachment_list = [attachment1, attachment2, attachment3]
zip_io = io.BytesIO()

with zipfile.ZipFile(zip_io, 'w', zipfile.ZIP_DEFLATED) as zip_file:
    for att in attachment_list:
        file_content = base64.b64decode(att.datas)
        zip_file.writestr(att.datas_fname, file_content)

zip_io.seek(0)
zip_b64 = base64.b64encode(zip_io.getvalue())

# 可选择将ZIP包也保存为附件
return self.env['ir.attachment'].create({
    'name': '批量报表打包.zip',
    'type': 'binary',
    'datas': zip_b64,
    'datas_fname': '批量报表打包.zip',
    'res_model': self._name,
    'res_id': self.id,
    'mimetype': 'application/zip'
})

内容的提问来源于stack exchange,提问作者Evan rianto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 03:27:07