报表是写在HTML / QWeb中,像Odoo中的所有普通视图。你可以使用普通QWeb 流程控制工具。PDF的渲染是通过wkhtmltopdf执行的。
如果要在某个模型上创建报表,则需要定义该报表和它将使用的报表模板。如果您愿意,还可以为该报表指定特定的报表格式。最后,如果您需要访问更多的模型,您可以定义一个自定义报表类,让您访问模板中的更多模型和记录
报表每个报表都必须通过报告操作(在odoo10参考系列--操作(Actions)中有介绍)声明。
为简单起见,可以使用快捷方式元素来定义报表,而不必手动设置操作及其环境。 可以具有以下属性:
id
生成的记录的外部id
name
(强制性的)
仅仅当查询一些列表中某个列表记录时作为报表的一个记忆/描述是有用的
model
(强制性的)
你报表将从事的模型
report_type
(强制性的)
要么是针对PDF报表的 qweb-pdf
要不是针对HTML的 qweb-html
report_name
报表的名称(它将是PDF输出的名称)
groups
Many2many
字段到允许查看/使用当前报表的组中
attachment_use
如果设置为True,则报告将使用attachment表达式生成的名称作为记录的附件存储;如果您只需要生成一次报告(例如出于法律原因),您可以使用它
attachment
定义报表名称的Python表达式;记录作为变量object是可访问的
paperformat
你希望使用的报表格式的外部id(如果不指定默认为公司的报表格式)
例子:
报表模版
最小可行的模板
最小的模板看起来像:
Report title
This object's name is
调用external_layout
将在报表中添加默认页眉和页脚。PDF正文将是
id
必须是报表声明中指定的名称; 例如上面报表中的 account.report_invoice
。由于这是一个QWeb模板,你可以访问所有被模版接收的docs对象的字段。
报表中有一些特定的变量可以访问,主要是:
docs
当前报表的记录
doc_ids
docs
记录的id列表
doc_model
docs
记录模型
time
来自Python标准库的time
参考
user
用户打印报表的res.user记录
res_company
当前user
的公司记录
如果您希望访问模板中的其他记录/模型,则需要一个自定义报表
可翻译的模版如果您希望将报表转换为合作伙伴的语言,则需要定义两个模板:
- 主报表模板
- 翻译的文件
然后你可以从你的主模版中调用翻译文件,这个模版带有一个设置语言代码(例如fr
或 en_US
)或者记录字段的属性t-lang。你也将需要重新浏览与适当的上下文相关的记录,如果你使用的是可译的字段(如国家名、销售条件等)
警告
如果你的报告模板不使用翻译的记录字段,再浏览其他语言记录是不必要的,会影响性能
例如,让我们看看销售模块的销售订单报表:
Invoice and shipping address:
Invoice address:
The主模版调用翻译使用 doc.partner_id.lang
作为t-lang
参数的模版,那么它将用合作伙伴的原因渲染。这样,每个销售订单将以相应客户的语言打印。 如果您只想翻译文档的主体,但将页眉和页脚保留在默认的语言中,可以用以下方式调用报表的外部布局:
提示
请注意,这只有在调用外部模版是有效的,你将不能通过设置一个在xml节点上的t-lang属性而不是 t-call
属性去翻译文件的一部分。 如果你要翻译模板的一部分,你可以使用这个模版部分来创建一个外部模版并从使用t-lang属性的主模版中调用它。
条码
条码是由一个控制器返回的图片,可以很容易地嵌入到QWeb语法报告:
可以将更多参数作为查询字符串传递
有用的备注
- Twitter Bootstrap和FontAwesome类可以用在你的报告模板
- 本地的CSS可以直接放在模板中
-
通过继承模板并插入CSS,可以在主报表布局中插入全局CSS:
.example-css-class {
background-color: red;
}
- 如果您的PDF报告缺少样式,请检查这些说明
报表格式
报表格式是report.paperformat的记录并包含以下属性:
name
(强制性的)
仅仅当查询一些列表中某个列表记录时作为报表的一个记忆/描述是有用的
description
对格式的小描述
format
要么是一个预定义的格式(A0 to A9, B0 to B10, Legal, Letter, Tabloid,...) 要么是 custom
;默认是A4格式。如果定义页面尺寸,则不能使用非自定义格式
dpi
输出的DPI;默认是90
margin_top
, margin_bottom
, margin_left
, margin_right
毫米的边距尺寸
page_height
, page_width
毫米的页面尺寸
orientation
竖向
header_line
布尔值以显示标题行
header_spacing
毫米的头间距
例子:
French Bank Check
custom
80
175
Portrait
3
3
3
3
3
80
定制报表
报表模型有一个默认的get_html
函数用以查询一个名叫report.module.report_name的模版。如果它存在,它将使用它去调用QWeb引擎;否则将使用一个通用的函数。如果您希望通过在模板(例如,像其他模型的记录)中包含更多的内容来定制报表,你可以定义这个模型,重写函数 render_html
并在docargs字典中传递对象:
from odoo import api, models
class ParticularReport(models.AbstractModel):
_name = 'report.module.report_name'
@api.model
def render_html(self, docids, data=None):
report_obj = self.env['report']
report = report_obj._get_report_from_name('module.report_name')
docargs = {
'doc_ids': docids,
'doc_model': report.model,
'docs': self,
}
return report_obj.render('module.report_name', docargs)
报表是网页
报表由报表模块动态生成,可以通过URL直接访问:
例如, 您可以通过HTML方式访问销售订单报报表: http:///report/html/sale.report_saleorder/38
或者你可以访问pdf版本:http:///report/pdf/sale.report_saleorder/38
ps:有翻译不当之处,欢迎留言指正。
原文地址:https://www.odoo.com/documentation/10.0/reference/reports.html
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?


微信扫码登录