我需要使用 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)
但不幸的是我只得到输出网页预览,但我需要直接下载响应。我应该做什么?
答案 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
。 Content-Length
标头,默认情况下werkzeug会这样做[source]