如何在控制器中仅显示一次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
相关产品推荐
相关产品推荐

