Frage

Ich mag die aktuelle Seite im Navigationsmenü markieren. Offensichtlich muss ich die Menü-Links eine Klasse wie ‚aktiv‘ geben, wenn Sie auf ihrer Seite sind. Dies ist ein klassisches Problem, und ich habe viele Lösungen vorgeschlagen gesehen. Mein Problem ist, ich sie alle hassen und betrachten keiner von ihnen sehr trocken sein. Zum Beispiel:

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

Der Tag nach Ihrer aktuellen Anfrage und eine URL Ausdruck und gibt ‚aktiv‘, wenn Sie zur Zeit auf dieser Seite sind. Alternativ kann dies mit benannten Ansichten gemacht werden, anstatt Urls aber das Prinzip ist das gleiche.

Mein Hauptproblem dabei ist, dass meine Navigation wird auf 99% meiner Ansichten und noch, um die aktuelle Anforderung variabel zu erhalten aufgerufen werden ich einen Request analysieren noch mit so etwas zu der Vorlage haben:

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

Warum muss ich auf jeden einzelnen meiner Ansichten diese context_instance Zeile hinzufügen, wenn wahrscheinlich alle, aber einer von ihnen muss die Anforderungsvariable, um die aktuelle URL / Ansicht zu erhalten, die aktiv zu markieren Verknüpfung? Dies scheint furchtbar nass, vor allem für eine Funktion, die in der großen Mehrheit der django-Sites sein muss. Ich mag die Anforderung standardmäßig enthalten sein und in der Lage, es optional unterdrücken. Ich kann nicht einen Weg, dies zu tun in Middleware finden, da ich nicht die Vorlage abfangen kann, bevor sein gemacht, nachdem die Ansicht hat es zurückgegeben.

Irgendwelche Vorschläge?

War es hilfreich?

Lösung

Ihre Absicht Sinn macht, müssen Sie RequestContext die meiste Zeit und nur selten kann es sicher aus Leistungsgründen verzichtet werden. Die Lösung ist einfach, statt render_to_response Verwendung direct_to_template Abkürzung:

from django.views.generic.simple import direct_to_template

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

... oder render_to Dekorateur von django-ärgerlich :

from annoying.decorators import render_to

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

Andere Tipps

Sie müssen nicht unbedingt etwas mit dem Markup Ihrer Navigation zu tun, dem aktuellen einen anderen Stil zu geben - es gibt deklarative Möglichkeiten, dass die Verwendung von CSS zu tun

.

Siehe meine Antwort hier: Django: gibt es eine bessere Art und Weise zu fett dem aktuellen Seite Link für ein Beispiel

.

Für die Zukunft kann man django-tabs für das, was OP wollte .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top