Django模板中{% if {club.c_type} == 'Tech' %}语句报错,求解决方案
问题解决:Django模板筛选社团类型错误
错误原因
- 模板语法错误:你的
{% if {club.c_type} == 'Tech' %}语句里,变量club.c_type多套了一层大括号,Django模板的if条件中直接写变量名即可,不需要额外包裹大括号。 - 数据匹配错误:模型中
c_type字段存储的是choices元组里的第一个值('T'或'NT'),而不是显示用的'Tech'或'Non-Tech',所以直接和'Tech'对比永远不成立,还会触发语法报错。
解决方案
方案一:模板内直接筛选(适合小数据量)
修正语法错误,同时用Django模型提供的get_字段名_display()方法获取choices对应的显示文本,或者直接和存储的键值对比:
方式1:使用显示文本匹配
<!-- 筛选Tech类型社团 --> {% for club in clubs %} {% if club.get_c_type_display == 'Tech' %} <!-- 这里写Tech社团的展示代码 --> {% endif %} {% endfor %} <!-- 筛选Non-Tech类型社团 --> {% for club in clubs %} {% if club.get_c_type_display == 'Non-Tech' %} <!-- 这里写Non-Tech社团的展示代码 --> {% endif %} {% endfor %}
方式2:直接匹配存储的键值(更高效)
<!-- 筛选Tech类型社团 --> {% for club in clubs %} {% if club.c_type == 'T' %} <!-- 这里写Tech社团的展示代码 --> {% endif %} {% endfor %} <!-- 筛选Non-Tech类型社团 --> {% for club in clubs %} {% if club.c_type == 'NT' %} <!-- 这里写Non-Tech社团的展示代码 --> {% endif %} {% endfor %}
方案二:视图中提前分类(推荐,减少模板循环次数)
在视图里直接将两类社团分别查询好,再传给模板,避免模板中多次遍历全量数据:
修改视图函数:
def clubs(request): # 直接筛选出Tech和Non-Tech社团 tech_clubs = Clubs.objects.filter(c_type='T') non_tech_clubs = Clubs.objects.filter(c_type='NT') return render(request, 'clubs.html', { 'tech_clubs': tech_clubs, 'non_tech_clubs': non_tech_clubs })
模板中直接使用分类好的数据:
<h3>Tech类型社团</h3> {% for club in tech_clubs %} <!-- Tech社团展示代码 --> {% endfor %} <h3>Non-Tech类型社团</h3> {% for club in non_tech_clubs %} <!-- Non-Tech社团展示代码 --> {% endfor %}
内容的提问来源于stack exchange,提问作者Nalin Kaushik
相关产品推荐
相关产品推荐

