使用t-call插入其他模板

来自Odoo大V社-odoo中文开发手册
95102545讨论 | 贡献2017年8月7日 (一) 23:45的版本

跳转至: 导航搜索

Qweb模板可以成为可复用的HTML代码段,可以被插入其他模板。我们不需要反复重复相同的HTML块,就可以设计出复杂的用户界面视图。

可复用的模板定义在<模板>标记并且被顶层元素以t-name 而不是kanban-box标识。这些其他模板可以通过t-call指令包含。在同一个插件模块的某个地方,或在不同的插件。在同一看板视图、同一个插件模块的某个地方中或在不同的插件中,声明的模板是正确的。

跟进者头像列表有时候被隔离到一个可重用片段,让我们可以使用子模板重做它。我们应从增加另外的模板到XML文件中开始, 在 <templates> 元素内部, <t tname="kanban-box"> 节点之后,如下所示:

<t t-name="follower_avatars">
<div>
<t t-foreach="record.message_parter_ids.raw_value.slice(0, 
3)" 
      t-as="rec">
<img t-att-src="kanban_image('res.partner', 
'image_small', rec)" 
        class="oe_avatar" width="24" height="24" />
</t>
</div></t>

从kanban-box调用主模板很简单。不需要<div>元素包括for each指令,我们应该使用以下内容:

<t t-call="follower_avatars" />

为调用其他插件模块中定义的模板,我们需要使用module.name全标识符,就像调用其它视图。例如,此段代码可以使用完整标识符来引用todo_kanban.follower_avatars. 调用的模板运行在与调用者相同的上下文中,所以在调用者中可用的任何变量名,在处理被调用模板时也可用。

一个更简洁的选择是传递参数到调用模板。这通过设置内部变量t-call标记实现。这些将仅在子模板上下文中进行计算并可用,并且不会在调用者的上下文中存在。

我们可以使用这个获得最大数量的跟进者头像,这个头像呗调用者设置,而无需通过子模板中不易修改的编码。首先,我们需要用变量arg_max代替固定值3,例如:

<t t-name="follower_avatars">
<div>
<t t-foreach="record.message_parter_ids.raw_value.slice(0, arg_max)"       t-as="rec">
<img t-att-src="kanban_image('res.partner', 
'image_small', rec)" 
        class="oe_avatar" width="24" height="24" />
</t>
</div>
</t>

<t t-call="follower_avatars">
<t t-set="arg_max" t-value="3" /></t>

然后,在执行子模板调用时定义该变量的值如下:

在t-call元素的整个内容也可通过改变变量值0使其对子模板可用。我们可以定义一个可以在子模板中使用的HTML代码片段,而不是通过参数变量<t traw="0" />.