Pregunta

Quiero resaltar la página actual en el menú de navegación. Obviamente, necesito dar a los enlaces del menú una clase como 'activa' cuando estás en su página. Este es un problema clásico y he visto muchas soluciones propuestas . Mi problema es que los odio a todos y considero que ninguno de ellos es muy SECO. Por ejemplo:

@register.simple_tag
def active(request, pattern):
    import re
    if re.search(pattern, request.path):
        return 'active'
    return ''

----

{% load tags %}
<div id="navigation">
    <a class="{% active request "^/about/" %}" href="/about/">About</a>
    <a class="{% active request "^/contact/" %}" href="/contact/">Contact</a>
    <a class="{% active request "^/services/" %}" href="/services/">Services</a>
</div>

La etiqueta toma su solicitud actual y una expresión de URL y devuelve 'activo' si está actualmente en esta página. Alternativamente, esto se puede hacer con vistas con nombre en lugar de URL, pero el principio es el mismo.

Mi principal problema con esto es que mi navegación se activará en el 99% de mis vistas y, sin embargo, para obtener la variable de solicitud actual, todavía tengo que analizar un RequestContext a la plantilla con algo como esto:

def contact(request):
    # snip ...
    return render_to_response(
                'contact.html',
                { 'myvar' : myvar },
                context_instance=RequestContext(request))

¿Por qué necesito agregar esta línea de instancia de contexto a cada una de mis vistas cuando probablemente todas menos una de ellas necesita la variable de solicitud para obtener la url / vista actual para resaltar la activa ¿enlazar? Esto parece terriblemente húmedo, especialmente para una característica que debe estar en la gran mayoría de los sitios de django. Quiero que la solicitud se incluya de forma predeterminada y poder suprimirla opcionalmente. No puedo encontrar una manera de hacer esto en el middleware ya que no puedo interceptar la plantilla antes de que se muestre después de que la vista la haya devuelto.

¿Alguna sugerencia?

¿Fue útil?

Solución

Su intención tiene sentido, necesitará RequestContext la mayor parte del tiempo y solo en raras ocasiones puede omitirse de manera segura por razones de rendimiento. La solución es simple, en lugar de render_to_response usar direct_to_template acceso directo:

from django.views.generic.simple import direct_to_template

def contact(request):
    # snip ...
    return direct_to_template(request, 'contact.html', { 'myvar' : myvar })

... o render_to decorador de django-annoying :

from annoying.decorators import render_to

@render_to('template.html')
def foo(request):          
    bar = Bar.object.all()  
    return {'bar': bar}     

Otros consejos

No necesariamente tiene que hacer nada al marcado de su navegación para darle al actual un estilo diferente; hay formas declarativas de hacerlo usando CSS.

Vea mi respuesta aquí: Django: ¿Hay alguna manera mejor de poner en negrita el enlace de la página actual como ejemplo?

Para referencia futura, uno puede usar django-tabs para hacer lo que OP quería .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top