Ich möchte die aktuelle Seite im Navigationsmenü hervorheben. Offensichtlich muss ich den Menülinks eine Klasse wie "aktiv" geben, wenn Sie auf ihrer Seite sind. Dies ist ein klassisches Problem und ich habe viele Lösungen proposed gesehen. Mein Problem ist, dass ich alle hasse und keine davon für sehr TROCKEN halte. Zum Beispiel:Warum muss ich in all meinen Antworten RequestContext übergeben?
@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 anstelle von URLs gemacht werden, aber das Prinzip ist das gleiche.
Mein Hauptproblem dabei ist, dass meine Navigation auf 99% meiner Ansichten und noch genannt werden, um die aktuelle Anforderung variabel zu bekommen Ich habe noch einen Request auf die Vorlage mit so etwas wie diesem analysiert:
def contact(request):
# snip ...
return render_to_response(
'contact.html',
{ 'myvar' : myvar },
context_instance=RequestContext(request))
Warum muss ich diese context_instance-Zeile zu jeder meiner Ansichten hinzufügen, wenn wahrscheinlich alle bis auf eine die Anforderungsvariable benötigt, um die aktuelle URL/Ansicht zur Hervorhebung der aktiven Verknüpfung zu erhalten? Das scheint furchtbar nass zu sein, vor allem für ein Feature, das in den allermeisten Django-Sites enthalten sein muss. Ich möchte, dass die Anfrage standardmäßig eingefügt wird und sie optional unterdrücken kann. Ich kann keine Möglichkeit finden, dies in der Middleware zu tun, da ich die Vorlage vor dem Rendern nicht abfangen kann, nachdem die Ansicht sie zurückgegeben hat.
Irgendwelche Vorschläge?
Der @render_to Dekorateur ist brilliant! Vielen Dank! – Jimmy
+1 für die Empfehlung von @render_to! Beachten Sie, dass [django-nervous] (https://github.com/skorokithakis/django-annoying) aufgrund von Inaktivität übernommen und verschoben wurde. – antiplex
4 Jahre später, und Django 1.5 hat die 'direct_to_template' entfernt. Was wäre nun der empfohlene Weg dafür, ohne Django-nervig zu benutzen – Patrick