Odoo 16 QWeb-PDF报表URI过长,如何切换为POST传参?
解决Odoo 16 QWeb-PDF报表Request-URI Too Long问题
当传递大数据量时,默认的GET请求会因为URL长度限制报错,以下是两种可行的解决方案:
方案一:后端直接生成PDF并返回响应(推荐)
绕过前端的GET请求流程,直接在后端生成PDF文件流并返回下载响应,完全避免URL长度限制问题。
在你的模型方法中替换原有代码:
from odoo.http import request def your_report_method(self): # 替换成你的报表外部ID report_ref = self.env.ref('XXXXXXXXX') # 生成PDF内容 pdf_content, _ = report_ref._render_qweb_pdf(self.ids, data=data) # 构造下载响应 response = request.make_response( pdf_content, headers=[ ('Content-Type', 'application/pdf'), ('Content-Disposition', 'attachment; filename="your_report_name.pdf"'), ] ) return response
方案二:自定义控制器支持POST请求
如果需要保留前端请求报表的流程,可以通过继承默认报表控制器,新增POST路由来处理大数据量请求。
步骤1:创建自定义控制器
在你的模块中添加控制器代码:
from odoo.addons.web.controllers.report import ReportController from odoo.http import route, request import json class CustomReportController(ReportController): @route( ['/web/report/pdf_post'], type='http', auth="user", methods=['POST'], csrf=False ) def report_pdf_post(self, report_ref, docids=None, data=None): # 处理参数 if docids: docids = [int(i) for i in docids.split(',')] data = request.jsonrequest if data is None else json.loads(data) # 获取报表对象并生成PDF report = request.env['ir.actions.report']._get_report_from_name(report_ref) pdf, _ = report._render_qweb_pdf(docids, data=data) # 返回响应 pdfhttpheaders = [ ('Content-Type', 'application/pdf'), ('Content-Length', str(len(pdf))), ] return request.make_response(pdf, headers=pdfhttpheaders)
步骤2:修改报表调用逻辑
在你的模型方法中,修改返回的action为POST请求:
def your_report_method(self): report_ref = self.env.ref('XXXXXXXXX') report_action = report_ref.report_action(self, data=data) # 替换为自定义POST路由 report_action.update({ 'type': 'ir.actions.act_url', 'url': f'/web/report/pdf_post?report_ref=XXXXXXXXX&docids={",".join(map(str, self.ids))}', 'target': 'new', 'method': 'POST', 'data': data, }) return report_action
说明
你之前尝试的config={'http_method': 'POST'}无效,是因为report_action的config参数并不支持设置请求方法,该参数主要用于报表渲染的内部配置。
内容的提问来源于stack exchange,提问作者klausjulius
相关产品推荐
相关产品推荐

