2011-09-29 20 views
9

Próbuję zmienić aktywny wybór linków nawigacyjnych na podstawie bieżącej strony, na której znajduje się użytkownik.Szablony Django: Porównanie bieżącego adresu URL z {% url xyz%}

Próbuję zrobić omething tak:

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

Alternatywnie, wiem, mogę określić zrobić coś takiego:

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

i dodać {% block current %}current{% endblock %} do każdego z odpowiednich szablonów, ale Wolałbym coś takiego, co staram się osiągnąć w pierwszym przykładzie, jeśli to możliwe

Dzięki!

Odpowiedz

14

Ponieważ prawdopodobnie będziesz musiał to zrobić tylko jeden raz - w szablonie nav - bardziej sensowne będzie zachowanie wszystkiego w jednym miejscu.

pierwsze odwrócić swoje nazwiska URL i przechowywać je w zmiennych jak Timmy zasugerował, wystarczy porównać je w szablonie:

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

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

Tylko upewnij się, że masz włączony procesor kontekst prośba więc masz dostęp do żądania w szablonie. Zrób to, dodając django.core.context_processors.debug do zmiennej ustawień TEMPLATE_CONTEXT_PROCESSORS.

2

Jak o:

<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> 

gdzie get_absolute_url jest omówione w docs Django.

Mimo to prawdopodobnie nie jest to najlepszy sposób na dostosowanie aktywnych nagłówków menu nawigacji, ale prawdopodobnie istnieją pewne sztuczki CSS, które mogą to zrobić bez tak dużego kodu. Powiedziałbym więcej, ale tylko rano pół filiżanki kawy ..

6

Jest to dość powszechny wymóg więc być może warto pisać swój własny szablon do wykonywania tego:

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

oraz w szablon

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

Oto ta sama idea zrobić nieco inaczej:

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

Powiązane problemy