Django模板for循环嵌套if时else块重复执行问题求解
问题原因
你把if/else判断写在了for循环内部,循环每遍历到一个不满足条件的对象就会执行一次else块,所以会重复渲染多个“Horario no disponible”单元格。你需要的逻辑是遍历完全部4个对象、没有任何一个符合匹配条件时,才渲染一次空状态。
解决方案
方案1(推荐,符合Django设计规范)
Django倡导“瘦模板、胖视图”,数据筛选逻辑不要写在模板里,移到视图层处理最简单:
- 在视图代码中提前筛选出符合条件的课表对象,示例:
# views.py def mostrar_horario(request): # 筛选周一8点的课表项,没有匹配结果时值为None lunes_8 = Horario.objects.filter(dia='Lunes', hora_inicio='8:00').first() # 其余原有业务逻辑 return render(request, 'horario.html', { 'lunes_8_horario': lunes_8, # 其余传给模板的上下文变量 })
- 模板中不需要写循环,直接判断筛选后的变量即可:
{% if lunes_8_horario %} <td> Asignatura: {{lunes_8_horario.id_asignatura.nombre}}<br> Profesor: {{lunes_8_horario.rut_profesor.p_nombre}} {{lunes_8_horario.rut_profesor.ap_paterno}}<br> Sala: {{lunes_8_horario.id_sala.id_sala}} </td> {% else %} <td>Horario no disponible</td> {% endif %}
小提示:如果你要渲染整页课表,可以在视图中先把所有课表按「星期+开始时间」分组整理成字典,模板渲染时直接按key取对应课表即可,不需要在模板中写循环匹配逻辑,可维护性和渲染效率都会高很多。
方案2(纯模板实现,不推荐)
Django默认模板不支持在循环内修改变量标记,如果强行在模板层实现,需要自定义模板标签来记录是否找到匹配项,开发和维护成本高于直接调整视图逻辑,因此不建议使用。
内容的提问来源于stack exchange,提问作者Alexis Barrueto
相关产品推荐
相关产品推荐

