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

如何在控制器中仅显示一次name字段?解决循环重复显示问题

解决循环中重复显示name字段的问题

这个问题我之前也碰到过——就是把公共的名称字段放进了循环体里,导致每遍历一条数据就重复渲染一次name对吧?给你两种可行的解决方式,你可以根据实际情况选:

方法一:在控制器层面拆分数据(推荐)

如果weather_conditions里的所有元素共享同一个name值,那最清晰的做法是在控制器里把这个公共的name单独提取出来,作为独立变量传给模板,这样就不用在循环里处理了。

比如你的控制器代码可以改成这样:

def your_controller_function(self):
    # 假设这里是你获取weather_conditions数据的逻辑
    weather_conditions = self.env['your.model'].search([])  # 替换成你的实际数据获取方式
    
    # 提取公共的name(如果列表不为空的话)
    location_name = weather_conditions[0].name if weather_conditions else ""
    
    # 把拆分后的变量传给模板
    return {
        'location_name': location_name,
        'weather_conditions': weather_conditions
    }

然后修改模板,把name放在循环外面:

<div class="container">
    <!-- 单独显示一次name -->
    <center><h4><t t-esc="location_name"/></h4></center>
    
    <!-- 只循环渲染表格部分 -->
    <t t-foreach="weather_conditions" t-as="contn">
        <table class="table table-bordered ">
            <tr>
                <td>Main:</td>
                <td><span t-esc="contn.main"/></td>
            </tr>
            <!-- 你的其他表格行代码 -->
        </table>
    </t>
</div>

方法二:在模板层面做条件判断(快速修复)

如果不想改动控制器代码,也可以直接在模板里判断,只在第一次循环时显示name。Odoo的foreach循环会自动生成{as}_index变量(这里就是contn_index),从0开始计数,我们可以利用这个变量做判断:

<div class="container">
    <t t-foreach="weather_conditions" t-as="contn">
        <!-- 只有第一次循环时显示name -->
        <t t-if="contn_index == 0">
            <center><h4><t t-esc="contn.name"/></h4></center>
        </t>
        
        <table class="table table-bordered ">
            <tr>
                <td>Main:</td>
                <td><span t-esc="contn.main"/></td>
            </tr>
            <!-- 你的其他表格行代码 -->
        </table>
    </t>
</div>

这两种方法都能解决重复显示的问题,第一种更符合代码逻辑的清晰性,第二种适合快速调整模板的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:11:41