2011-09-29 21 views
9

ユーザーがいる現在のページに基づいてナビゲーションリンクのアクティブな選択を変更しようとしています。Djangoテンプレート:現在のURLと{%url 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 %}を追加しますが、可能であれば最初の例で達成しようとしているImのようなものを好むだろう

ありがとう!

答えて

14

あなたはnavテンプレートでこれを一度だけ行う必要があるので、すべてを1か所に保存する方が理にかなっています。

まず、あなたのURL名を逆にし、ティミーが提案のように変数に格納し、その後、単にテンプレートでそれらを比較:

{% 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設定変数に追加することで行います。

2

方法について:

Djangoのドキュメントで説明したようにはget_absolute_urlがある
<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> 

それでも、アクティブなナビゲーションメニューのヘッダーをカスタマイズするには、おそらく最善の方法ではないかもしれませんが、コードなしでそれを行うことができるCSSトリックがあります。

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:]) 

と内:それは、これを実行するために、独自のテンプレートタグを書く価値があるかもしれないので、私はこれはかなり一般的な要件..です

6

をより多くを語るだけで、この朝のコーヒーの半カップを持っていたと思います

http://gnuvince.wordpress.com/2007/09/14/a-django-template-tag-for-the-current-active-page/ ます。http://www.turnkeylinux.oここ

{% 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> 
    ... 

あなたのテンプレートは少し異なる行って同じ考えですrg/blog/django-navbar

関連する問題