8

我正在实施一个引导程序 navbar,如此处的示例所示

导航栏中的项目是<li>'s,“选定”项目具有属性class="active"

  <li class="active"> <a href="#"> Link1 </a> </li>
  <li>                <a href="#"> Link2 </a> </li>

在 Django 中,这些项目将位于一个模板中,该模板包含在任何应该显示导航栏的模板中。我正在考虑这样做:

<li> <a href="/"        class="{% if template_name == "home.djhtml"    %}active{% endif %}"> Home    </a> </li>
<li> <a href="about/"   class="{% if template_name == "about.djhtml"   %}active{% endif %}"> About   </a> </li>
<li> <a href="contact/" class="{% if template_name == "contact.djhtml" %}active{% endif %}"> Contact </a> </li>

我想知道是否有一种内置的方法来获取template_name(即正在渲染的模板,传递给render_to_response(), in views.py

当然,我可以显式地向 中添加一个template_name变量render_to_response(),这将解决问题。但是考虑到 DRY,我觉得这不应该是必要的。

4

4 回答 4

14

对于将类添加到活动选项卡、菜单项等的用例,我通常使用自定义模板标记。

@register.simple_tag
def active_page(request, view_name):
    from django.core.urlresolvers import resolve, Resolver404
    if not request:
        return ""
    try:
        return "active" if resolve(request.path_info).url_name == view_name else ""
    except Resolver404:
        return ""

这是顶部导航的一个片段:

<ul class="nav">
    <li class="{% active_page request "about" %}"><a href="{% url "about" %}">About</a></li>
    ...
</ul>
于 2013-10-09T10:57:59.093 回答
3

我用:

class="{% if 'about' in request.path %}active{% endif %}"

如果 URI 发生变化,它会更短且更健壮,只要注意是否有多个路径使用 about。

于 2016-06-20T16:58:44.343 回答
2

有一种更快的方法,无需创建任何自定义模板标签!

<ul class = 'nav'>
    <li class="{% ifequal request.path 'about/'%} active {% endifequal%}">
        <a href="{% url "about" %}">About</a>
    </li>
</ul>

请注意 request.path。它可能在路径的开头或结尾带有斜杠符号!

于 2014-08-30T16:09:31.490 回答
0

附加Django 1.7 的prog.Dusans答案

settings.py
TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.request',
    'django.contrib.auth.context_processors.auth'
)

views.py
from django.shortcuts import render

def index(request):
    return render(request, 'index.html')

template
{% ifequal request.path '/pathname'%}active{% endifequal%}

最好是将其添加到基本模板中,这样您只需执行一次。

像我一样,这个版本比Kevin Stones更多,因为你必须向模板添加几乎相同的代码,而且根本不需要模板标签。

于 2015-06-10T20:35:16.100 回答