Django:如何获取正在呈现的模板的名称

时间:2013-10-09 09:54:47

标签: django twitter-bootstrap django-templates twitter-bootstrap-3 navbar

我正在实施bootstrap navbar,如本例here所示

导航栏中的项目为<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()中传递给views.py的模板。 / p>

当然,我可以向template_name明确添加render_to_response()变量,这样可以解决问题。但考虑到DRY我觉得不应该这样做。

4 个答案:

答案 0 :(得分: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>

答案 1 :(得分:3)

我用:

GET http://localhost:8000/template/ngCart/addtocart.html 404 (Not Found)

如果URI发生变化,它会更短,更强大,只需注意是否有多条路径使用。

答案 2 :(得分:2)

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

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

请注意request.path。它可能是在开头的斜线符号或没有在路径的末尾!

答案 3 :(得分: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一样,因为你必须为模板添加几乎相同的代码,毕竟不需要模板标记。