QWeb是一个基于xml的模板引擎,用于生成HTML片段和页面。
模板指令是写在xml标签中,以t-开头。
创建一个QWeb视图,只需要一个arch元素并包含以下的属性:
<p><t t-esc="要显示的内容"/></p>
<div> <t t-if="condition"> <p>ok</p> </t> </div> #当condition是true的时候解析成: <div> <p>ok</p> </div> #condition为false的时候解析成 <div> </div>
还有t-elif/t-else:
<div> <p t-if="user.birthday == today()">Happy bithday!</p> <p t-elif="user.login == ‘root‘">Welcome master!</p> <p t-else="">Welcome!</p> </div>
t-foreach用来指定需要循环处理的数据,t-as提供的是在后面用于代表当前项目的变量名。
<t t-foreach="[1, 2, 3]" t-as="i"> <p><t t-esc="i"/></p> </t> #上述语句输出: <p>1</p> <p>2</p> <p>3</p>
qweb可以对属性进行实时计算并在输出时设置,通过t-attr来实现,有三种形式:
1)t-att-属性名
可以根据属性名创建一个属性:<div t-att-a="42"/> //创建属性a,属性值为42 #输出 <div a="42"></div>
属性值也可以为一个 格式化字符串,可以在运行期间确定具体值,作为属性值
<li t-attf-class="row {{ item_parity }}">//item_parity在运行时确定值
t-att=mapping
如果参数是映射表,每个键值对会生成一个属性:<div t-att="{‘a‘: 1, ‘b‘: 2}"/> #输出 <div a="1" b="2"></div>
t-att=pair
如果参数是元组或2个元素的数组,那么第一个项就作为属性名,第二个作为属性值:<div t-att="[‘a‘, ‘b‘]"/> #输出 <div a="b"></div>
使用t-set属性来实现变量声明,它的值就是设置的变量名。然后用t-value属性的属性值作为新变量的值。
<t t-set="foo" t-value="2 + 1"/> <t t-esc="foo"/> #输出3
<t t-call="other-template"/>//调用指定名字的模板
t-field
只能用于格式化记录字段(从browe函数获取到的),可以根据字段类型自动匹配格式;t-options
只能用于自定义字段,最常用的是widget
,其他的选项都是field-xx
或widget-xx
response = http.request.render(‘模版名‘, {参数列表}) #会直接从controller里返回一个响应对象
在ir.ui.view:
中的render方法:
ir.ui.view
记录会自动加载,它会为渲染环境设置一系列默认值
<templates> <t t-name="template-name"> <!-- template code --> </t> </templates>
模板继承是用来修改已存在的模板,即给在其他模块定义的模板添加内容。
通过t-extend
来表示,它的值是被继承的模板名,通过t-jquery来定位,通过t-operation来指定修改的位置/方式。
<t t-extend="base.template"> <t t-jquery="ul" t-operation="append"> <li>new element</li> </t> </t>
t-jquery
是一个css选择器,用于选择需要改变的节点,并通过t-operation
指定需要进行的操作
<t t-log="打印信息"/>
<t t-if="condition"> <t t-debug=""> </t>
该节点内容里的javascript代码会在渲染时执行,接收一个context参数,将当前的环境传给js,从而可以使用context.XX调用上下文中的内容。
<t t-js="ctx"> console.log("var is", ctx.var); </t>
原文:https://www.cnblogs.com/ygj0930/p/10826202.html