使用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:

  1. this is x: ${x}
  2. 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.
  3. 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:

  1. % if x==5:
  2. this is some output
  3. % 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

  1. ## -*- coding: utf-8 -*-
  2. <html>
  3. <head>
  4. <%include file="mako_header.html"/>
  5. </head>
  6. % for o in objects:
  7. <body>
  8. <table width="100" border="0" cellspacing="0" cellpadding="0">
  9. <tr>
  10. <td>
  11. <p><small><b>Shipping address :</b></small>
  12. </td>
  13. </tr>
  14. <tr>
  15. <td>
  16. <small>${ o.partner_id.title or '' } ${ o.partner_id.name }</small>
  17. </td>
  18. </tr>
  19. <tr>
  20. <td>
  21. <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>
  22. </td>
  23. </tr>
  24. </table>
  25. <table>
  26. <tr align="left">
  27. <th>Description</th>
  28. <th>VAT</th>
  29. <th>Quantity</th>
  30. <th>Unit Price</th>
  31. <th>Disc.(%)</th>
  32. <th>Price</th>
  33. </tr>
  34. % for line in o.order_line:
  35. <tr>
  36. <td>${line.name}</p>
  37. <td>${', '.join(map(lambda x: x.name, line.tax_id))}</td>
  38. <td>${line.product_uos and line.product_uos_qty or line.product_uom_qty}
  39. ${line.product_uos and line.product_uos.name or line.product_uom.name}</td>
  40. <td>${line.price_unit}</td>
  41. <td>${line.discount or 0.00 }</td>
  42. <td>${line.price_subtotal or 0.00 }</td>
  43. </tr>
  44. % if line['notes']:
  45. <tr>
  46. <td>${line.notes}</td>
  47. </tr>
  48. % endif
  49. % endfor
  50. </table>
  51. </body>
  52. % endfor
  53. <%include file="mako_footer.html"/>
  54. </html>

可以根据需要用 HTML格式化报表.

有报表头和报表尾(header and footer)的报表

如果希望在报表中加入公司专有的页眉,需要包含 <%include file=”mako_header.html”/> 加入页脚需要包含 <%include file=”mako_footer.html”/> 这些文件会从数据库中读出你预先为公司定义好的页眉页脚.