2011-09-29 12 views
9

Sto provando a modificare la selezione attiva dei miei collegamenti di navigazione in base alla pagina corrente in cui si trova l'utente.Modelli Django: confronto dell'url corrente con {% url xyz%}

Io sto cercando di fare omething in questo modo:

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

In alternativa, so che potrei definire fare qualcosa di simile:

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

e aggiungere un {% block current %}current{% endblock %} a ciascuno dei modelli rilevanti, ma Preferirei qualcosa di simile a ciò che sto cercando di ottenere nel primo esempio, se possibile

Grazie!

risposta

14

Dal momento che probabilmente dovrai farlo solo una volta - nel tuo modello di navigazione - ha più senso per me tenere tutto in un posto.

Prima invertire i vostri nomi URL e memorizzarli in variabili come Timmy ha suggerito, quindi semplicemente confrontare nel modello:

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

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

Basta fare in modo che avete il vostro processore contesto di richiesta abilitato in modo da avere accesso alla richiesta nel modello. A tale scopo, aggiungi django.core.context_processors.debug nella variabile delle impostazioni TEMPLATE_CONTEXT_PROCESSORS.

2

ne dite:

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

dove get_absolute_url è come discusso nella documentazione Django.

Probabilmente non è ancora il modo migliore per personalizzare le intestazioni attive del menu di navigazione, probabilmente ci sono alcuni trucchi CSS che possono farlo senza tanto codice. Mi piacerebbe dire di più, ma aveva solo una mezza tazza di caffè di questa mattina ..

6

Questo è piuttosto un requisito comune quindi potrebbe essere utile scrivere il proprio tag modello per eseguire questo:

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

e in il modello

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

Ecco la stessa idea fatto in modo leggermente diverso:

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