odoo12学习 ——自定义pdf的打印和下载

1,923 阅读2分钟

依据了odoo销售模块的写法。

一、定义Model

class demo_user(models.Model):
    _name = 'demo.user'
    _description = '用户'
    
    name = fields.Char('姓名')
    sex = fields.Char('性别')
    age = fields.Integer('年龄')
    
    @api.multi
    def preview_user(self):    # 需要在form页面自定义按钮事件
        self.ensure_one()
        return {
            'type': 'ir.actions.act_url',
            'target': 'self',
            'url': self.get_user_url(),
        }
    
    @api.multi
    def get_user_url(self,report_type=None,download=False):
        if download and report_type:   # 判断是否下载pdf
            return '/user/' + self.name + '?report_type=' + report_type + '&download=' + str(download)
        elif report_type:
            return '/user/' + self.name + '?report_type=' + report_type
        else:
            return '/user/' + self.name

二、定义Template展示页面

创建一个xml文件,需要把它放到__manifest__.py

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <template id="user_template" name="User Template">
        <div>
            <label>姓名:</label><span t-esc="values.name"></span>
            <label>性别:</label><span t-esc="values.sex"></span>
            <label>年龄:</label><span t-esc="values.age"></span>
        </div>
        <div>
        <a t-att-href="data.get_user_url(report_type='pdf', download=True)">下载</a>
        <a t-att-href="data.get_user_url(report_type='pdf')">打印</a>
        </div>
    </template>
</odoo>

三、定义报表记录

同样需要创建一个xml文件,需要把它放__manifest__.py

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <data>
        <report
            id="action_report_user"
            string="打印"
            model="demo.user"
            report_type="qweb-pdf"
            file="模块名.report_user" # pdf模板名称
            name="模块名.report_user"
        />
    </data>
</odoo>

四、定义pdf模板

创建一个xml文件,放入__manifest__.py

<?xml version="1.0" encoding="UTF-8" ?>

<odoo>
    <template id="report_user">
        <t t-call="web.html_container">
            <t t-foreach="docs" t-as="doc">
                <t t-call="web.external_layout">
                    <div class="page">
                        <label>姓名:</label><span t-esc="values.name"></span>
                        <label>性别:</label><span t-esc="values.sex"></span>
                        <label>年龄:</label><span t-esc="values.age"></span>
                    </div>
                </t>
            </t>
        </t>
    </template>
</odoo>

五、定义路由

from odoo.addons.portal.controllers.portal import CustomerPortal
from odoo import http
from odoo.http import request,content_disposition

class user(CustomerPortal):
    @http.route('/user/<string:name>', auth='public', website=True)
    def user_route(self, name, report_type=None, download=False, **kw):
        user = http.request.env['demo.user'].search([('name','=', name)])
        # 判断是否下载或者打印
        if report_type in ('html', 'pdf', 'text'):
            report_sudo = request.env.ref('模块名.action_report_user').sudo()
            method_name = 'render_qweb_%s' % (report_type)
            report = getattr(report_sudo, method_name)([user.id], data={'report_type': report_type})[0]
            reporthttpheaders = [
                ('Content-Type', 'application/pdf' if report_type == 'pdf' else 'text/html'),
                ('Content-Length', len(report)),
            ]
            if report_type == 'pdf' and download:
                filename = "pdf文件名称.pdf"
                reporthttpheaders.append(('Content-Disposition', content_disposition(filename)))
            return request.make_response(report, headers=reporthttpheaders)
        return http.request.render('模块名.user_template',{'values':user})

完成!