Django模板中if语句匹配异常问题求助
解决Django模板中组名与组织名称匹配不显示的问题
嘿,我之前碰到过一模一样的情况!明明看着两个值完全相同,模板里的if判断就是不触发,十有八九是大小写不一致或者隐藏的空格/空白字符在捣乱。咱们一步步来排查和解决:
第一步:先确认两个值是否真的完全一致
你可以在模板里临时加一段调试代码,把两个值的原始内容、长度都打印出来,就能知道是不是真的相等了:
{% for page in object_list %} {% for group in request.user.groups.all %} <!-- 临时调试用,之后可以删掉 --> <p>组名: "{{ group.name }}" (长度: {{ group.name|length }})</p> <p>页面组织: "{{ page.organisation }}" (长度: {{ page.organisation|length }})</p> <p>不区分大小写是否相等: {{ group.name.lower == page.organisation.lower }}</p> {% if page.organisation == group.name %} <li>{{ page.page_name }}</li> <li>{{ page.data_location }}</li> <li>{{ page.organisation }}</li> {% endif %} {% endfor %} {% endfor %}
比如你测试数据里写的Abc和abc,大小写不同的话严格相等判断就会失败;如果长度不一样,那肯定是有隐藏的空格或者其他空白字符。
第二步:针对性解决问题
根据调试结果,选对应的方案就行:
方案1:统一大小写比较
如果是大小写的问题,直接在判断里把两个值都转成小写(或大写):
{% if page.organisation.lower == group.name.lower %} <li>{{ page.page_name }}</li> <li>{{ page.data_location }}</li> <li>{{ page.organisation }}</li> {% endif %}
方案2:去除空白字符
如果是有隐藏的空格(比如数据库里的组织名称末尾多了空格,或者组名前后有空格),用trim过滤器去掉两端空白:
{% if page.organisation|trim == group.name|trim %} <li>{{ page.page_name }}</li> <li>{{ page.data_location }}</li> <li>{{ page.organisation }}</li> {% endif %}
方案3:后端提前过滤(更推荐)
其实模板里嵌套循环加判断效率不高,最好的做法是在视图里提前把数据过滤好,只返回当前用户有权限看的页面:
# 你的视图文件里 from django.views.generic import ListView from .models import Page class PageListView(ListView): model = Page context_object_name = 'object_list' def get_queryset(self): # 获取当前用户所有组的名称 user_group_names = self.request.user.groups.values_list('name', flat=True) # 只返回组织名称在用户组里的页面 return Page.objects.filter(organisation__in=user_group_names)
这样模板里就不用复杂的嵌套和判断了,直接遍历就行:
{% for page in object_list %} <li>{{ page.page_name }}</li> <li>{{ page.data_location }}</li> <li>{{ page.organisation }}</li> {% endfor %}
内容的提问来源于stack exchange,提问作者Arripis
相关产品推荐
相关产品推荐

