2011-09-29 55 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