Allgemeiner Aufbau und best-practice einer Tab Navigation

13 views
Skip to first unread message

Matthias Scholz

unread,
Aug 24, 2009, 10:06:53 AM8/24/09
to Django-de
Hallo Gruppe,
ich bastel gerade an einem kleinen Django Projekt. Das Layout der
Seite steht bereits. Wichtig dabei ist, dass die Navigation ein
einfaches CSS Tab Menü ist, dass die Webseite in verschiedene Bereiche
unterteilt. Nun würde ich gerne für jede URL in meiner URLconf eine
Variable übergeben die angibt in welchem Bereich sich die jeweilige
URL befindet und dementsprechend soll auch das dazugehörige Tab als
"aktiv" erscheinen.

Das Template dazu sieht im Moment so aus, vielleicht wird es dann noch
deutlicher was ich meine:
<ul>
<li><a {% ifequal tab 'start' %}id="klick" {% endifequal %}
href="/"><span>Start</span></a></li>
<li><a {% ifequal tab 'infos' %}id="klick" {% endifequal %}href="/
informationen/"><span>Informationen</span></a></li>
...
</ul>

URLconf (vereinfacht):
urlpatterns = patterns('',
(r'^$', willkommen, {'tab': 'start'} ),
(r'^$', informationen, {'tab': 'infos'} ),
...)

Was mir dabei nun nicht gefällt ist, dass ich in jedem View das "tab"
argument auswerten muss und dann dem RequestContext übergeben muss.
Das verstößt gegen meine Interpretation des DRY Prinzips. Noch
problematischer wird es bei den eingebauten Views von Django, wie z.b.
den auth_views. Dort gibt es überhauptkeine Möglichkeit weitere
Argumente an die Views zu übergeben.

Alles was ich will ist eine Variable pro URL in der URLconf zu
spezifizieren die dann in jedem Template verfügbar ist. Das muss doch
irgendwie möglich sein...

Deswegen meine Frage: Wie würdet ihr sowas am besten lösen? Ich bin
leider noch relativ unerfahren mit Django, deswegen frage ich auch so
blöd. Gibt es da vielleicht die Möglichkeit über eine Middleware oder
über einen Wrapper View das Problem zu bewerkstelligen? Oder geht es
vielleicht noch viel einfacher und ich seh den Wald vor lauter Bäumen
nicht?

Vielen Dank schonmal im Voraus,
Matthias

Martin Mahner

unread,
Aug 24, 2009, 8:10:24 PM8/24/09
to Django-de
Hallo,

ich mache es ungefähr so.

Jedes Template basiert (extended) eine base.html. Diese schaut
ungefähr so aus:

<body id="{% block body_id %}{% endblock %}
<ul>
<li class="homepage">Homepage</li>
<li class="contact">Contact</li>
...
</ul>
{% block content %}
...
</body>

Jedes "Subtemplate" definiert den block body_id

# contact.html
{% extends "base.html" %}
{% block body_id %}contact{% endblock %}
{% block content %}
bla
{% endblock %}

Unterseiten die auf einer anderen Unterseite basieren, zum Beispiel
contact_impressum.html supern den Block:

# contact_impressum.html
{% extends "contact.html" %}
{% block body_id %}{{ block.super }}{% endblock %}

Das Styling der Tabs selbst übernimmt dann CSS:

body#contact li.contact{ font-weight: bold; }

Oder im base.html Template statt der body-ID Javascript verwenden,
hier jQuery:

$('li.{{ block body_id }}{{ endblock }}').addClass('active');

HTH, Martin

Matthias Scholz

unread,
Aug 25, 2009, 10:17:57 AM8/25/09
to Django-de
Hallo Martin,
einen ganz herzlichen Dank an dich! Das ist natürlich die beste
Lösung. Ich habe keine Ahnung wieso ich nicht selbst darauf gekommen
bin... Das mit dem Wald vor lauter Bäumen nicht sehen war also
garnicht so falsch. Ich mache das mit dem Base Template genauso, also
ist diese Lösung für mich wirklich perfekt!

Vielen Dank!
Matthias

martingeber

unread,
Sep 4, 2009, 8:43:30 AM9/4/09
to Django-de
Jepp, so mach ich es auch., geht am besten...
Und Design Logik liegt auch nur im CSS, nirgendwo sonst, wo es eh
nichts zu suchen hat.

On 25 Aug., 02:10, Martin Mahner <mar...@mahner.org> wrote:
Reply all
Reply to author
Forward
0 new messages