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
相关产品推荐
相关产品推荐

