7

ich in diesem Beispiel ein bootstrapnavbar als Show Umsetzung hereDjango: Wie der Name der Vorlage erhalten gerendert wird

Artikel in einem navbar <li>'s sind, das „ausgewählt“ Element hat das Attribut class="active":

In Django befinden sich diese Elemente in einer Vorlage, die von allen Vorlagen eingeschlossen wird, die die Navigationsleiste anzeigen sollen. Ich denke an es auf diese Weise tun:

<li> <a href="/"  class="{% if template_name == "home.djhtml" %}active{% endif %}"> Home </a> </li> 
<li> <a href="about/" class="{% if template_name == "about.djhtml" %}active{% endif %}"> About </a> </li> 
<li> <a href="contact/" class="{% if template_name == "contact.djhtml" %}active{% endif %}"> Contact </a> </li> 

Ich würde gerne wissen, ob es eine eingebaute Möglichkeit, die bekommen template_name (das heißt, die Vorlage wiedergegeben wird, als zu render_to_response() weitergegeben, in views.py)

Sicher, ich könnte eine template_name Variable render_to_response() Variable explizit hinzufügen, die das Problem lösen würde. Aber denke an DRY Ich denke, das sollte nicht nötig sein.

+1

Explizit ist besser als implizit :) –

+0

Sie sollten die URLs in Ihren Templates nicht fest codieren (verwenden Sie stattdessen den '{% url%}' TemplateTag), und Sie sollten sich auf URLs und 'request.path' verlassen - keine Template-Namen - um zu prüfen, ob ein Link aktiv ist. –

+0

Danke, dass du @bruno darauf hingewiesen hast, ich werde das ändern. –

Antwort

14

Normalerweise verwende ich ein eigenes Template Tag für diesen Anwendungsfall eine Klasse auf die aktive Registerkarte Hinzufügen, Menüpunkt usw.

@register.simple_tag 
def active_page(request, view_name): 
    from django.core.urlresolvers import resolve, Resolver404 
    if not request: 
     return "" 
    try: 
     return "active" if resolve(request.path_info).url_name == view_name else "" 
    except Resolver404: 
     return "" 

Und hier ist ein Ausschnitt aus dem oberen nav:

<ul class="nav"> 
    <li class="{% active_page request "about" %}"><a href="{% url "about" %}">About</a></li> 
    ... 
</ul> 
+0

Danke. Wie soll ich auf das 'request' Objekt zugreifen: es als' dictionary' Variable an 'render()' übergeben? –

+1

So geht's: http://stackoverflow.com/questions/702592/django-request-in-template – slumtrimpet

+0

@slumtrimpet hat es. Es wird von 'RequestContext' bereitgestellt, vorausgesetzt, Sie verwenden es in Ihrem Template-Rendering (Django Class Based Views tun dies automatisch). –

2

Es gibt einen viel schnelleren Weg, ohne benutzerdefinierte Template-Tags zu erstellen!

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

nur über request.path. Es könnte mit Schrägstrich-Symbol am Anfang oder ohne am Ende des Pfades sein!

0

Anfügen prog.Dusans Antwort für Django 1,7

settings.py 
TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.request', 
    'django.contrib.auth.context_processors.auth' 
) 

views.py 
from django.shortcuts import render 

def index(request): 
    return render(request, 'index.html') 

template 
{% ifequal request.path '/pathname'%}active{% endifequal%} 

Am besten ist es mit der Basis-Vorlage hinzuzufügen, so brauchen Sie nur einmal zu tun.

Wie ich diese Version mehr als Kevin Stones, weil Sie fast identische Code der Vorlage hinzufügen müssen und keine Vorlage Tag schließlich benötigen.

3

Ich benutze:

class="{% if 'about' in request.path %}active{% endif %}" 

Es ist ein wenig kürzer und robuster, wenn die URI Änderungen, achten Sie nur, wenn mehr als ein Weg zu verwendet.

Verwandte Themen