You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QWeb子模板变量修改不生效?咨询变量作用域及实现方案

QWeb子模板无法修改变量的原因及解决方法

问题原因

QWeb的t-call指令会为子模板创建独立的局部作用域,默认情况下,子模板中用t-set定义或修改的变量仅在该局部作用域内生效,不会影响父模板(主模板)中的变量。这就是为什么你两次调用子模板时foo始终是2,主模板里的foo还是初始值1。

解决方案

有两种常用方法可以实现跨作用域修改变量:

方法1:使用t-set的scope属性指定父作用域

修改子模板中的t-set指令,通过scope="parent"明确将变量修改应用到父作用域:

<template id="my_subtemplate">
    <t t-set="foo" t-value="foo + 1" scope="parent"/>
    <p>Inside subtemplate: <t t-esc="foo"/></p>
</template>

主模板无需修改,此时调用后会得到你预期的结果:

Inside subtemplate: 2
Inside subtemplate: 3
Inside main template: 3

方法2:通过引用类型变量(对象)传递

因为对象是引用类型,子模板中修改对象的属性会同步到父作用域。

主模板中把变量包装成对象:

<t t-set="data" t-value="{'foo': 1}"/>
<t t-call="my_module.my_subtemplate"/>
<t t-call="my_module.my_subtemplate"/>
<p>Inside main template: <t t-esc="data.foo"/></p>

子模板中修改对象的属性:

<template id="my_subtemplate">
    <t t-set="data.foo" t-value="data.foo + 1"/>
    <p>Inside subtemplate: <t t-esc="data.foo"/></p>
</template>

这种方式同样能实现变量的累加效果。

内容的提问来源于stack exchange,提问作者forvas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:42:05