转载:http://book.odoomommy.com/chapter2/README4.html
第四章 QWeb
原生Qweb的继承
基础的QWeb继承与之前的xml的写法都不一样,首先不需要odoo标签的包裹,另外不同于普通的模板,基础模板的写法需要使用templates标签包裹。
例如,我们给Many2one的部件添加一个前缀12345,可以这么写:
<templates><t t-extend="FieldMany2One"><t t-jquery=".o_field_many2one" t-operation="before"><a>123456</a></t></t>
</templates>
t-extend用于扩展Qweb的内容,配合t-operation可以实现xml中position类似的效果,具体来说,t-operation有以下几种值可以选择:
- append: 节点的主体被附加在上下文节点的末尾(在上下文节点的最后一个子节点之后)
- prepend: 节点的主体被添加到上下文节点(在上下文节点的第一个子节点之前插入)
- before: 节点的主体被插入在上下文节点之前
- after: 节点的主体被插入在上下文节点之后
- inner: 节点的主体替换上下文节点的子节点
- replace: 该节点的主体用于替换上下文节点本身
t-jquery指令采用一个CSS selector。此选择器用于扩展模板以选择应用指定的t-operation的上下文节点。
如果使用t-extend,odoo会要求你必须写入一个t-jquery选择器,如果想要使用replace的本身节点话,就会冲突。此时,你应该选择放弃使用t-extend,而使用同名的t-name将原有的代码覆盖掉,就像python的后定义的方法会覆盖掉前面定义的方法一样。
另外,如果想要完全重写某个QWeb部件,那么可以不用上面提到的几种操作,直接简单粗暴的定义一个同名的QWeb部件即可,后加载的部件会覆盖掉之前定义的部件。
Qweb的传值
类似python中的jinja2模板,odoo中的qweb也是可以通过后台传值给前端页面的,前端页面也可以进行逻辑判断。Qweb中的逻辑判断使用标签,常见的t类标签有:
逻辑控制 t-if
t-if 主要用于条件判断:
<t t-if="condition"><p>Test</p>
</t>
数据输出 t-esc
t-esc用于输出变量的值:
<p><t t-esc="value"/></p>
字段输出 t-field
<td><span t-field="ml.product_id.display_name"/><br/><span t-field="ml.product_id.description_picking"/>
</td>
t-esc和t-field的区别
t-esc用于输出数据,其值为python表达式执行完的结果。t-field 只能用于字段的访问,且只对存储的字段有效。另外,t-field-options可用于格式化字段值。例如:
<t-field="o.date" t-field-options='{"widget":"date"'}'/>
逻辑循环 t-foreach
t-foreach 用于迭代循环:
<t t-foreach="[1, 2, 3]" t-as="i"><p><t t-esc="i"/></p>
</t>
t-as 将每次迭代的值传给变量i,方便后续的调用。
这里有多个内置的变量(以i为例):
- i_all: 迭代的对象
- i_value: 迭代对象的值,一般情况下和i的值相同,但是当迭代字典时,i为key,i_value为字典的值
- i_index: 序列
- i_size: 迭代列表的长度
- i_first: 列表的第一个值
- i_last: 列表的最后一个值
- i_parity: 当前迭代的奇偶性
- i_even: 当前迭代是否为偶数
- i_odd: 当前迭代是否为奇数
赋值变量 t-set
t-set可以自定义变量:
<t t-set="existing_variable" t-value="False"/>
设置属性值
qweb可以用于设置html中的元素的属性值。
t-att-$name
t-att-$name用于创建动态的属性名:
<div t-att-name="42">
将创建一个拥有name属性值为42的节点:
<div name="42">
t-attf-$name
t-attf-$name与t-att-$name类似,区别在于t-attf-$name输出的是格式化的字符串:
<t t-foreach="[1, 2, 3]" t-as="item"><li t-attf-class="row {
{ (item_index % 2 === 0) ? 'even' : 'odd'"><t t-out="item"/></li>
</t>
输出:
<li class="row even">1</li>
<li class="row odd">2</li>
<li class="row even">3</li>
数据的格式化
对应货币的金额精度,可以使用format_currency方法来格式化货币的精度:
<td class = "pos-right-align"> <tt-esc = "widget.format_currency (taxdetail.amount)" />
</ td>
对于不需要货币符号的数字,可以使用