2011-09-29 37 views
9

Estoy intentando cambiar la selección activa de mis enlaces de navegación en función de la página actual en la que se encuentra el usuario.Plantillas Django: Comparación de la URL actual con {% url xyz%}

que estoy tratando de hacer omething así:

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

Por otra parte, sé que podría definir hacer algo como esto:

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

y añadir un {% block current %}current{% endblock %} a cada una de las plantillas pertinentes, pero Prefiero algo así como lo que estoy tratando de lograr en el primer ejemplo si es posible

Gracias!

Respuesta

14

Dado que probablemente solo necesite hacer esto una vez, en su plantilla de navegación, tiene más sentido para mí mantener todo en un solo lugar.

En primer lugar, invertir sus nombres de URL y almacenarlos en variables como Tim sugirió, entonces simplemente compararlos en la plantilla:

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

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

Sólo asegúrese de que ha habilitado su procesador contexto de la petición para que tenga acceso a la solicitud en la plantilla. Haga esto agregando django.core.context_processors.debug en su variable de configuración TEMPLATE_CONTEXT_PROCESSORS.

2

¿Qué tal:

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

donde get_absolute_url es como se explica en la documentación de Django.

Sin embargo, probablemente todavía no sea la mejor manera de personalizar los encabezados de menú de navegación activa, probablemente haya algunos trucos CSS que pueden hacerlo sin tanto código. Yo diría más, pero sólo tenía la mitad de una taza de café esta mañana ..

6

Este es un requisito común por lo que valdría la pena escribir su propia etiqueta de plantilla para realizar esto:

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

y en su plantilla

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

Ésta es la misma idea hecho de forma ligeramente diferente:

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