Django模板中如何匹配url_name前缀实现菜单及子页面自动激活高亮
解决方案
你只需要把判断逻辑反转,直接判断目标关键词是否存在于当前url_name中即可,Django模板语法原生支持in运算符:
{% with request.resolver_match.url_name as url_name %} <li class="menu-item {% if 'settings' in url_name %}active{% endif %}"> <a href="{% url 'settings' %}" class="nk-menu-link"> <span class="menu-text">Settings</span> </a> </li> {% endwith %}
这种写法下所有名称包含settings的路由,比如settings、settings-password、settings-profile、settings-notification等,都会自动命中判断条件,给菜单加上激活类。
进阶优化(多菜单场景推荐)
如果你有大量不同前缀的菜单需要判断,也可以自定义模板过滤器来简化代码:
- 首先在你的Django应用下创建
templatetags目录,新增menu_tags.py文件:
from django import template register = template.Library() @register.filter def is_active_menu(url_name, prefix): return prefix in url_name
- 在模板顶部引入自定义标签:
{% load menu_tags %}
- 菜单判断逻辑简化为:
<li class="menu-item {% if url_name|is_active_menu:'settings' %}active{% endif %}"> <a href="{% url 'settings' %}" class="nk-menu-link"> <span class="menu-text">Settings</span> </a> </li> <!-- 其他菜单同理,修改前缀参数即可 --> <li class="menu-item {% if url_name|is_active_menu:'user' %}active{% endif %}"> <a href="{% url 'user_center' %}" class="nk-menu-link"> <span class="menu-text">用户中心</span> </a> </li>
注意事项
如果你要严格匹配前缀而不是任意位置包含关键词,可以把判断逻辑改成使用Django内置的startswith过滤器:
{% if url_name|startswith:'settings' %}
这种写法可以避免路由名称其他位置出现关键词的误匹配情况。
内容的提问来源于stack exchange,提问作者sixovov947
相关产品推荐
相关产品推荐

