如何在Django中为循环生成的侧边栏链接添加active类?
问题:动态生成的侧边栏链接添加active类
我有一个侧边栏,部分链接会在URL与链接名称匹配时添加active类,但还有一些链接是在模板中通过for循环生成的。我需要在这些链接被打开时为其添加active类,当前使用id来关联它们。
相关代码
模板代码
{% for branch in branches %} <li> <a href="{% url 'manager-branch-workers' branch.id %}">{{branch.name}}</a> </li> {% endfor %}
urls.py代码
urlpatterns = [ ... path('workers/<int:pk>/', views.BranchWorkerList, name='manager-branch-workers') ]
解决方案
完全可以通过对比URL中的pk参数和循环里的branch.id来实现,这里提供两种实用方案:
方案一:直接在模板中利用request对象获取URL参数
Django模板可以通过request.resolver_match.kwargs.pk获取当前URL里的pk值,将其与branch.id对比,匹配时添加active类:
{% for branch in branches %} <li> <a href="{% url 'manager-branch-workers' branch.id %}" {% if request.resolver_match.kwargs.pk == branch.id|stringformat:"i" %}class="active"{% endif %}> {{ branch.name }} </a> </li> {% endfor %}
注:
request.resolver_match.kwargs.pk返回的是字符串类型,所以用stringformat:"i"把整数类型的branch.id转成字符串,保证对比准确。如果你的Django版本在3.1及以上,也可以直接用整数对比,不用转格式。
方案二:在视图中传递当前分支ID到模板
如果觉得模板里处理类型转换麻烦,也可以在视图层把当前分支ID传入模板上下文:
# views.py def BranchWorkerList(request, pk): # 此处保留你的原有业务逻辑 return render(request, '你的模板路径.html', { # 其他上下文变量 'current_branch_id': pk })
然后在模板中直接对比:
{% for branch in branches %} <li> <a href="{% url 'manager-branch-workers' branch.id %}" {% if current_branch_id == branch.id %}class="active"{% endif %}> {{ branch.name }} </a> </li> {% endfor %}
两种方案都能满足需求,方案一无需修改视图代码更快捷,方案二逻辑更直观,可根据实际情况选择。
内容的提问来源于stack exchange,提问作者Timur Arazmedov
相关产品推荐
相关产品推荐

