Domanda

Voglio evidenziare la pagina corrente nel menu di navigazione. Ovviamente ho bisogno di dare ai collegamenti di menu una classe come 'attiva' quando sei sulla loro pagina. Questo è un problema classico e ho visto molte soluzioni proposte . Il mio problema è che li odio tutti e non considero nessuno di loro molto ASCIUTTO. Ad esempio:

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

Il tag accetta la tua richiesta corrente e un'espressione url e restituisce "attivo" se sei attualmente in questa pagina. In alternativa, ciò può essere fatto con viste con nome anziché con URL, ma il principio è lo stesso.

Il mio problema principale con questo è che la mia navigazione verrà chiamata sul 99% delle mie visualizzazioni e tuttavia, per ottenere la variabile di richiesta corrente ho ancora analizzare un RequestContext nel modello con qualcosa del genere:

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

Perché devo aggiungere questa linea context_instance a ciascuna delle mie viste quando probabilmente tutte tranne una hanno bisogno della variabile richiesta per ottenere l'URL / vista corrente per evidenziare l'attivo creare un collegamento? Questo sembra terribilmente bagnato, specialmente per una caratteristica che deve essere nella stragrande maggioranza dei siti di django. Voglio che la richiesta sia inclusa per impostazione predefinita e che sia possibile eliminarla facoltativamente. Non riesco a trovare un modo per farlo nel middleware in quanto non riesco a intercettare il modello prima che sia reso dopo che la vista lo ha restituito.

Qualche suggerimento?

È stato utile?

Soluzione

La tua intenzione ha senso, ti servirà RequestContext la maggior parte delle volte e solo raramente può essere omessa in sicurezza per motivi di prestazioni. La soluzione è semplice, invece di render_to_response usa direct_to_template scorciatoia:

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 decoratore di django-fastidioso :

from annoying.decorators import render_to

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

Altri suggerimenti

Non devi necessariamente fare nulla per il markup della tua navigazione per dare a quello attuale uno stile diverso - ci sono modi dichiarativi per farlo usando i CSS.

Vedi la mia risposta qui: Django: c'è un modo migliore per mettere in grassetto il link della pagina corrente per un esempio.

Per riferimento futuro, si può usare django-tabs per fare ciò che OP voleva .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top