Django项目中模板if语句失效,如何排查修复?
问题分析与解决方案
核心问题
你模板里的外层{% if leads.lead_status == "Active Deal" %}逻辑错误:leads是ListView传递的QuerySet(结果集/列表),并非单个Lead对象,它没有lead_status属性,这个判断永远不成立,导致内部的for循环完全不执行,页面自然没有数据展示。
两种修复方案
方案1:在模板内逐个判断Lead状态
把状态判断放到for循环内部,对每个Lead对象单独校验:
{% for lead in leads %} {% if lead.lead_status == "Active Deal" %} <tr> <td data-href="{% url 'leads:lead-detail' lead.pk %}"><i class="far fa-paper-plane"></i> {{ lead.id }}</td> <td>{{ lead.first_name|title }} {{ lead.last_name|title }}</td> <td>{{ lead.city|title }}</td> <td>{{ lead.state|upper }}</td> <td data-href="tel:{{ lead.phone }}">{{ lead.phone }} <i class="fas fa-phone-square"></i> </td> <td>$34,567.89</td> <td> {% if not lead.contract_out %} --/--/---- {% else %} {{ lead.contract_out }} {% endif %} </td> <td> {% if not lead.contract_back %} --/--/---- {% else %} {{ lead.contract_back }} {% endif %} </td> <td> {% if not lead.hearing_date %} --/--/---- {% else %} {{ lead.hearing_date }} {% endif %} </td> </tr> {% endif %} {% endfor %}
注:把{% if lead.contract_out == "" %}改成{% if not lead.contract_out %}更简洁,符合Django模板的空值判断习惯
方案2:在View层提前过滤数据(推荐)
直接在数据库层面过滤出lead_status为"Active Deal"的Lead,减少不必要的数据传输,模板逻辑更简洁:
修改views.py的get_queryset方法:
def get_queryset(self): user = self.request.user # 新增lead_status过滤条件,用模型常量避免硬编码 queryset = Lead.objects.filter(agent__user=user, lead_status=Lead.ACTIVE) return queryset
然后模板里去掉外层无效的if判断,直接遍历即可:
{% for lead in leads %} <tr> <td data-href="{% url 'leads:lead-detail' lead.pk %}"><i class="far fa-paper-plane"></i> {{ lead.id }}</td> <td>{{ lead.first_name|title }} {{ lead.last_name|title }}</td> <td>{{ lead.city|title }}</td> <td>{{ lead.state|upper }}</td> <td data-href="tel:{{ lead.phone }}">{{ lead.phone }} <i class="fas fa-phone-square"></i> </td> <td>$34,567.89</td> <td> {% if not lead.contract_out %} --/--/---- {% else %} {{ lead.contract_out }} {% endif %} </td> <td> {% if not lead.contract_back %} --/--/---- {% else %} {{ lead.contract_back }} {% endif %} </td> <td> {% if not lead.hearing_date %} --/--/---- {% else %} {{ lead.hearing_date }} {% endif %} </td> </tr> {% endfor %}
额外检查点
- 确认数据库中存在
lead_status设为"Active Deal"、且关联agent为当前登录用户的Lead记录 - 若使用方案2,确保模型中的
ACTIVE常量值与数据库存储的一致(你模型里的ACTIVE = 'Active Deal'是正确的)
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

