当前位置: 代码迷 >> 综合 >> 【转载】odoo技术开发白皮书 第二部分 第十六章 QWeb
  详细解决方案

【转载】odoo技术开发白皮书 第二部分 第十六章 QWeb

热度:98   发布时间:2024-01-04 22:54:12.0

转载: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>

对于不需要货币符号的数字,可以使用