自定义HTML报表 - xiaohao0576/odoo-doc GitHub Wiki
在Odoo Online版本,可以借助html报告做出自定义的网页,可以引入第三方的字体,css和javascript,基本上是完全自定义了页面。实现思路如下
模型包含以下字段
x_data , JSON类型,用于存储Python字典数据 x_json, TEXT类型,用于存储json字符串 x_name, Char,用于存储报表的名称
在x_report模型上,创建html报告,在qWeb中,可以引入第三方的css和js库,在odoo服务中取出动态数据,写入html中,供javascript生成动态页面,代码片断如下:
<html>
<body>
<script id="report-data" type="application/json">
<t t-foreach="docs" t-as="doc">
<t t-raw="doc.x_json" />
</t>
</script>
</body>
</html>
在javascript中获取并加载数据
// 获取并解析预加载的数据
const reportDataScript = document.getElementById('report-data');
const reportData = JSON.parse(reportDataScript.textContent);
在需要做报表的模型上,创建一个服务器动作,使用Python代码,可以做任意的数据提取和变换,甚至可以使用sql语句,直接从数据库取出数据。
提取出数据后,把数据保存到x_report中, 其中需要使用到json_dumps进行json序列化,示例代码如下
products = env['product.product'].search([], limit=10)
fields = ['name','barcode','list_price']
data = products.read(fields)
us = env['res.users.settings'].search([],limit=1)
json_dumps = us._fields['homemenu_config'].convert_to_export
json_str = json_dumps(data, us)
report = env['x_report'].create({
'x_name': 'report01',
'x_data': data,
'x_json': json_str
})
服务器动作的action
# 定义 URL
url = f'https://your-domain.odoo.com/report/html/{report.x_name}/{report.id}'
# 创建 URL 动作
action = {
'type': 'ir.actions.act_url',
'url': url,
'target': 'new' # 在新的标签页中打开
}
如果是日报,周报,不需要每次都查询数据库,准备新数据的,可以在服务器动作中,借助x_report
数据行中的create_date
, create_uid
等字段,判断数据的有效期,如果可以直接使用,就没必要再重新提取转换数据,这起到了缓存的作用
还可以使用自动化动作,定期去更新x_report
的x_data
和x_json
字段,起到定期刷新数据的目的。