依据了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})
完成!