5

我想在导航菜单中突出显示当前页面。显然,当您在他们的页面上时,我需要给菜单链接一个像“活动”这样的类。这是一个经典问题,我已经看到了很多解决方案。我的问题是我讨厌所有这些,并且认为它们都不是很干燥。例如:

@register.simple_tag
def active(request, pattern):
    import re
    if re.search(pattern, request.path):
        return 'active'
    return ''

----

{% load tags %}
<div id="navigation">
    <a class="{% active request "^/about/" %}" href="/about/">About</a>
    <a class="{% active request "^/contact/" %}" href="/contact/">Contact</a>
    <a class="{% active request "^/services/" %}" href="/services/">Services</a>
</div>

该标签接受您当前的请求和一个 url 表达式,如果您当前在此页面上,则返回“活动”。或者,这可以使用命名视图而不是 url 来完成,但原理是相同的。

我的主要问题是我的导航将在 99% 的视图上调用,然而,为了获取当前的请求变量,我仍然需要将 RequestContext 解析为模板,如下所示:

def contact(request):
    # snip ...
    return render_to_response(
                'contact.html',
                { 'myvar' : myvar },
                context_instance=RequestContext(request))

为什么我需要将这个 context_instance 行添加到我的每一个视图中,而除了其中一个之外的所有视图都需要请求变量以获取当前 url/视图以突出显示活动链接?这似乎非常潮湿,尤其是对于必须在绝大多数 django 站点中的功能。我希望默认情况下包含该请求,并且可以选择禁止它。我找不到在中间件中执行此操作的方法,因为在视图返回模板后,我无法在模板呈现之前拦截模板。

有什么建议么?

4

3 回答 3

16

您的意图是有道理的,您将需要RequestContext大部分时间,并且很少出于性能原因可以安全地省略它。解决方案很简单,而不是render_to_response使用direct_to_template快捷方式:

from django.views.generic.simple import direct_to_template

def contact(request):
    # snip ...
    return direct_to_template(request, 'contact.html', { 'myvar' : myvar })

...或来自django-annoying 的render_to装饰器:

from annoying.decorators import render_to

@render_to('template.html')
def foo(request):          
    bar = Bar.object.all()  
    return {'bar': bar}     
于 2009-06-27T14:23:10.867 回答
1

您不必对导航标记做任何事情来为当前导航标记提供不同的样式 - 有使用 CSS 的声明性方法来做到这一点。

请在此处查看我的答案:Django:是否有更好的方法以粗体显示当前页面链接作为示例。

于 2009-06-27T07:42:29.100 回答
0

为了将来参考,可以使用django-tabs来做 OP 想要的事情。

于 2011-02-10T12:42:51.987 回答