This is the documentation for older versions of Odoo (formerly OpenERP).

See the new Odoo user documentation.

See the new Odoo technical documentation.

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

## -*- 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格式化报表.