2011-09-29 53 views
9

我正在尝试根据用户所处的当前页面更改我的导航链接的活动选择。Django模板:将当前网址与{%网址xyz%}进行比较

我试图做omething这样的:

<li {% if request.get_full_path == {% url profile_edit_personal %} %}class="current"{% endif %}><a href="{% url profile_edit_personal %}">Personal Details</a></li> 

另外,我知道我可以明确做这样的事情:

<li class="{% block current %}{% endblock %}"><a href="{% url profile_edit_personal %}">Personal Details</a></li> 

,并添加{% block current %}current{% endblock %}到每个相关的模板,但我宁愿像我试图在第一个例子中尽可能实现的东西

谢谢!

回答

14

由于您可能只需要做一次 - 在您的导航模板中 - 将所有内容保存在一个位置更有意义。

第一反向您的网址名称,并将其存储在变量像邓肯建议,然后只需在模板中对它们进行比较:

{% url 'about_page' as about %} 
... 

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

只要确保你已经启用了您的请求,背景处理器,所以你可以访问请求在模板中。通过在您的TEMPLATE_CONTEXT_PROCESSORS设置变量中添加django.core.context_processors.debug来完成此操作。

2

如何:

<li {% if request.get_full_path == profile_edit_personal.get_absolute_url %} 
    class="current"{% endif %}><a href="{% url profile_edit_personal %}"> 
    Personal Details</a></li> 

其中get_absolute_url是Django文档中讨论。

它仍然可能不是定制活动导航菜单标题的最佳方式,但可能有一些CSS技巧可以在没有太多代码的情况下完成。我会说更多,但只有咖啡半杯今天上午..

6

这是一个相当普遍的要求,所以它可能是值得写自己的模板标签来执行此:

class isCurrentNode(template.Node): 
    def __init__(self, patterns): 
     self.patterns = patterns 
    def render(self, context): 
     path = context['request'].path 
     for pattern in self.patterns: 
      curr_pattern = template.Variable(pattern).resolve(context) 
      if path == curr_pattern: 
     return "current" 
      return "" 

@register.tag 
def is_current(parser, token): 
    """ Check if the browse is currently at this supplied url""" 
    args = token.split_contents() 
    if len(args) < 2: 
     raise template.TemplateSyntaxError, "%r tag requires at least one argument" % args[0] 
    return isCurrentNode(args[1:]) 

和您的模板

{% url about_page as about %} 
{% url home_page as home %} 
... 

<ul> 
    <li class="{% is_current home %}"><a href="{{ home }}">Home</a></li> 
    <li class="{% is_current about %}"><a href="{{ about }}">About</a></li> 
    ... 

这里有同样的想法,做略有不同:

http://gnuvince.wordpress.com/2007/09/14/a-django-template-tag-for-the-current-active-page/ HTTP://www.turnkeylinux.o rg/blog/django-navbar