如何创建一个自定义按钮,以便在odoo 13中下载pdf报告?

问题描述

我想在odoo员工模型中创建一个自定义按钮,该按钮将创建并下载带有该员工工作合同的pdf。我试图对odoo中的给定按钮进行反向工程,但是我的每种方法都失败了。有人提示从哪里开始吗?非常感谢!

解决方法

我通常使用下载按钮返回一个URL action,并为URL编写一个controller。结果是单击实际上下载文件的按钮。

第一步是编写您的Qweb报告。我在这里写一个示例。请注意,报告ID为action_report_test_contract,稍后将在控制器中使用。

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <report string="Test Contract" id="action_report_test_contract" model="hr.contract" name="your_module_folder_name.test_contract_report" file="your_module_folder_name.test_contract_report" report_type="qweb-pdf" print_report_name="'%s - Contract' % (object.name)" />

    <template id="test_contract_report">
        <t t-call="web.html_container">
            <t t-foreach="docs" t-as="doc">
                <t t-call="web.internal_layout">
                    <div class="page">
                        <h1><t t-esc="doc.name"/></h1>
                        <h2>Employee: <t t-esc="doc.employee_id.name"/></h2>
                        <h2>Start Date: <t t-esc="doc.date_start"/></h2>
                    </div>
                </t>
            </t>
        </t>
    </template>
</odoo>

别忘了将报告文件路径添加到您的清单中。测试打印合同中的报告,是的,示例有效。现在,继承hr.employee模块以添加下载方法。

class HrEmployee(models.Model):
    _inherit = "hr.employee"

    def button_download_contract(self):
        if not self.contract_id:
            return
        return {
                'type' : 'ir.actions.act_url','url': '/web/download/test-contract-report?contract_id=%s'%(self.contract_id.id),'target': 'self',}

此外,继承视图以添加下载按钮:

<button name="button_download_contract" type="object" string="Download Contract" icon="fa-download"/>

最后,完成控制器:

from odoo import http
from odoo.http import request,content_disposition,route

class testDownload(http.Controller):
    
    @route(['/web/download/test-contract-report'],type='http',auth="user")
    def download_pdf(self,contract_id,**kw):
        employee_contract = request.env['hr.contract'].sudo().search([('id','=',contract_id)],limit=1)
        if not employee_contract:
            return None
        pdf,_ = request.env.ref('your_module_folder_name.action_report_test_contract').sudo().render_qweb_pdf([int(contract_id)])
        pdfhttpheaders = [('Content-Type','application/pdf'),('Content-Length',len(pdf)),('Content-Disposition',content_disposition('%s - Contract.PDF' % (employee_contract.name)))]
        return request.make_response(pdf,headers=pdfhttpheaders)

请注意,方法render_qweb_pdf依赖于报表对象。因此,使用的是action_report_test_contract,而不是test_contract_report

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...