使用Mako模板的HTML报表
注解
只在trunk实现的
Mako的是用Python编写一个模板库。它提供了一个熟悉的,非XML的语法,编译成Python模块以获得最佳性能.
Mako 模板
语法
Mako模板可以解析 XML, HTML, email text, 等文字流(parsed from a text stream) .
Mako模板含有Mako特有的指令(Mako-specific directives), 包括变量、表达式替换(expression substitution),控制结构(比如条件和循环,conditionals and loops),服务器端命令,完整的Python代码块,这些就像不同功能的标签(tag)一样易用。所有这些指令都解析为Python代码.
这意味着在Mako模板中,你可以最大化发挥Python的优势.
表达式替换
最简单的表达式是变量替换。 Mako模板中使用 ${} 结构,而不是rml中的 [[ ]] .
eg:
this is x: ${x}
Above, the string representation of x is applied to the template's output stream where x comes from the localcontext supplied to the template's rendering function.
The contents within the ${} tag are evaluated by Python directly.
Control Structures: | |
---|---|
在Mako中,控制结构 (i.e. if/else, 循环 (像 while 和 for), 包括 try/except) 都使用 % 标记,之后接上普通的Python控制表达式即可。在控制结构结束时,使用 “end<name>” 标记,”<name>” 是控制结构的关键字: |
eg:
% if x==5:
this is some output
% endif
Python 块
在 <% %> 标记中, 你可以加入普通的Python代码块。虽然之中的代码可以加入任意的空格,但是还是注意下格式比较好。Mako的编译器会根据周围生成的 Python代码结构,调整Python代码块中的格式.
有用的链接:
http://www.makotemplates.org/docs/
销售订单中的例子
销售完整的例子请从下面的地址参照 sale_report_html 模块 :
https://code.launchpad.net/~openerp-community/openobject-addons/trunk-addons-community
## -*- coding: utf-8 -*-
<html>
<head>
<%include file="mako_header.html"/>
</head>
% for o in objects:
<body>
<table width="100" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
<p><small><b>Shipping address :</b></small>
</td>
</tr>
<tr>
<td>
<small>${ o.partner_id.title or '' } ${ o.partner_id.name }</small>
</td>
</tr>
<tr>
<td>
<small>${ o.partner_shipping_id.state_id and o.partner_shipping_id.state_id.name or '' } ${ o.partner_shipping_id.country_id and o.partner_shipping_id.country_id.name or '' }</small>
</td>
</tr>
</table>
<table>
<tr align="left">
<th>Description</th>
<th>VAT</th>
<th>Quantity</th>
<th>Unit Price</th>
<th>Disc.(%)</th>
<th>Price</th>
</tr>
% for line in o.order_line:
<tr>
<td>${line.name}</p>
<td>${', '.join(map(lambda x: x.name, line.tax_id))}</td>
<td>${line.product_uos and line.product_uos_qty or line.product_uom_qty}
${line.product_uos and line.product_uos.name or line.product_uom.name}</td>
<td>${line.price_unit}</td>
<td>${line.discount or 0.00 }</td>
<td>${line.price_subtotal or 0.00 }</td>
</tr>
% if line['notes']:
<tr>
<td>${line.notes}</td>
</tr>
% endif
% endfor
</table>
</body>
% endfor
<%include file="mako_footer.html"/>
</html>
可以根据需要用 HTML格式化报表.
有报表头和报表尾(header and footer)的报表
如果希望在报表中加入公司专有的页眉,需要包含 <%include file=”mako_header.html”/> 加入页脚需要包含 <%include file=”mako_footer.html”/> 这些文件会从数据库中读出你预先为公司定义好的页眉页脚.