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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 07:40:19