如何使用odoo网站页面上的按钮下载报告文件?

时间:2017-03-23 14:35:42

标签: controller report openerp odoo-9

我需要使用 odoo网站页面上的按钮下载odoo报告。 我做的是:

<a class="btn btn-primary hidden-print cms-print-pdf" t-att-href="'/cms/report/print?id='+str(main_object.id)">
                            <span><i class="fa fa-print" aria-hidden="true"></i>
                            <!--<input type="hidden" id="cms_page_id" t-att-value="main_object.id"/>-->
                            </span>
                            Print</a>

在我的控制器中

@http.route(['/cms/report/print'], type='http', auth="public", website=True)
def print_saleorder(self, **kw):
    cr, uid, context = request.cr, SUPERUSER_ID, request.context
    sale_order_id = request.session.get('sale_last_order_id')
    if 2:
        pdf = request.registry['report'].get_pdf(cr, uid, [2], 'x.cms_html_body', data=None,
                                                 context=context)
        pdfhttpheaders = [('Content-Type', 'application/pdf'), ('Content-Length', len(pdf))]

        return request.make_response(pdf, headers=pdfhttpheaders)

但不幸的是我只得到输出网页预览,但我需要直接下载响应。我应该做什么?

1 个答案:

答案 0 :(得分:0)

您需要在回复中添加Content-Disposition标头,表明这是一个附件,这意味着它应该保存在本地而不是内联[source],例如:

@http.route(['/cms/report/print'], type='http', auth="public", website=True)
def print_saleorder(self, **kw):
    cr, uid, context = request.cr, SUPERUSER_ID, request.context
    sale_order_id = request.session.get('sale_last_order_id')
    if 2:
        pdf = request.registry['report'].get_pdf(cr, uid, [2], 'x.cms_html_body', data=None,
                                                context=context)
        pdfhttpheaders = [
            ('Content-Type', 'application/pdf'),
            ('Content-Length', len(pdf)),
            ('Content-Disposition', 'attachment; filename="report.pdf"'),
        ]
        return request.make_response(pdf, headers=pdfhttpheaders)

其中 report.pdf 将是下载文件的名称。

对您的代码的一些评论:

  • 在您的代码中,if 2:条件毫无意义,因为它始终会评估为True
  • 我认为你不需要明确设置set Content-Length标头,默认情况下werkzeug会这样做[source]