Template und Navigation

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Samstag 18. April 2009, 14:53

Hallo,

arbeite hier gerade an einer Seite bei der der entsprechende Link (der Seite die gerade offen ist) gehighlighted werden soll.

Code: Alles auswählen

<li><a {{ open_overview }} href="{{ url_for('main.views.index') }}">Übersicht</a></li>
<li><a {{ open_development }} href="{{ url_for('app.views.index') }}">Entwicklung</a></li>
<li><strong>Nachrichten</strong>
	<ul>
		<li><a {{ open_new_message }} href="{{ url_for('myacc.views.new_message') }}">Neue Nachricht</a></li>
		<li><a {{ open_inbox }} href="{{ url_for('myacc.views.inbox') }}">Posteingang</a></li>
		<li><a {{ open_outbox }} href="{{ url_for('myacc.views.outbox') }}">Postausgang</a></li>
	</ul>
</li>
<li><a {{ open_config }} href="{{ url_for('myacc.views.config') }}">Einstellungen</a></li>
So sieht die Navi aus, die ich in meinem globalen Template habe, welches für jede Seite verwendet wird.

So soll im endeffekt ein "offener" Link/Seite aussehen:

Code: Alles auswählen

<li><a class="open" href="index">Übersicht</a></li>
Nun muss ich in jedem Template ein:

Code: Alles auswählen

{% set open_overview = ' class="open"' %}
setzen, damit im obigen Beispiel das entsprechende class="open" gesetzt wird...

Kann man das irgendwie eleganter lösen?
(ich verwende Jinja2)

Danke!
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sonntag 19. April 2009, 08:17

Für Django hatte ich mir um dieses Problem zu lösen, einen eigenen Custom-Tag geschrieben, der sich um die Darstellung aller <li> gekümmert hat und mit einer Request-Middleware wie folgt zusammenarbeitet: Im View steht der Name der URL und das, was als Text angezeigt werden soll. Aus dem Namen der URL wird die URL berechnet. Die Middleware weiß aus dem Request-Objekt, wie die aktuelle URL ist. Ist eine der berechneten URLs ein Präfix der aktuellen URL, wird dieses <li> markiert.

Code: Alles auswählen

{% navigation %}
  {% url main.views.index %} -- Übersicht
  {% url app.views.index %} -- Entwicklung
  ...
{% endnavigation %}
Inzwischen würde ich's wohl etwas anders lösen. Bei Django konnte (kann) man nicht so einfach den Code für das "url"-Tag wiederverwenden. Daher musste ich das so einbetten. Wenn das bei Jinja einfach geht, ist wohl ein einzelnes Tag pro Zeile besser, also:

Code: Alles auswählen

<li><a {{ navigation_for('main.views.index') }}>Übersicht</a></li>
<li><a {{ navigation_for('app.views.index') }}>Entwicklung</a></li>
Was dann auch für beliebige Untermenüs funktioniert und einfach nur das `href="/url" class="active"` erzeugt. Weiter Attribute oder andere Elemente als <a> sind damit problemlos möglich.

Stefan
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Sonntag 19. April 2009, 08:40

Super! Danke für deine Anregungen!
Antworten