Question

Je souhaite mettre en surbrillance la page en cours dans le menu de navigation. Il est évident que je dois attribuer aux liens de menu une classe du type "actif" lorsque vous êtes sur leur page. C’est un problème classique et j’ai vu de nombreuses solutions proposées . Mon problème est que je les déteste tous et que je ne considère aucun d'entre eux comme très sec. Par exemple:

@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 balise prend votre demande actuelle et une expression d'URL et renvoie "actif" si vous vous trouvez actuellement sur cette page. Vous pouvez également utiliser des vues nommées plutôt que des URL, mais le principe est le même.

Mon problème principal avec ceci est que ma navigation sera appelée sur 99% de mes vues. Pourtant, pour obtenir la variable de requête actuelle, il me reste à analyser un RequestContext au modèle avec quelque chose comme ceci:

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

Pourquoi dois-je ajouter cette ligne context_instance à chacun de mes points de vue alors que tous sauf un d'entre eux a besoin de la variable de requête pour que l'URL / vue en cours mette en surbrillance l'actif lien? Cela semble terriblement humide, en particulier pour une fonctionnalité qui doit figurer dans la grande majorité des sites django. Je veux que la demande soit incluse par défaut et puisse éventuellement la supprimer. Je ne trouve pas de moyen de le faire dans un middleware, car je ne peux pas intercepter le modèle avant qu'il ne soit restitué une fois que la vue l'a renvoyé.

Des suggestions?

Était-ce utile?

La solution

Votre intention est logique, vous aurez besoin de RequestContext la plupart du temps et rarement vous pourrez l'omettre en toute sécurité pour des raisons de performances. La solution est simple, au lieu de render_to_response utiliser direct_to_template le raccourci clavier

.
from django.views.generic.simple import direct_to_template

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

... ou render_to décorateur de django-ennoying :

from annoying.decorators import render_to

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

Autres conseils

Vous n'avez pas nécessairement besoin de modifier le balisage de votre navigation pour donner au style actuel un style différent - il existe des moyens déclaratifs de le faire en utilisant CSS.

Voir ma réponse ici: Django: Existe-t-il un meilleur moyen de mettre en gras le lien de page en cours , par exemple?

Pour référence future, vous pouvez utiliser les django-tabs pour faire ce que l'OP voulait .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top