Ich habe eine base.html Vorlage, die eine Liste von Links enthält.
Beispiel:
%Vor%Dann habe ich in meiner views.py eine Definition für jeden von index.html, stuff.html, about.html und contact.html. Jede dieser Vorlagen leitet sich einfach von einer base.html-Vorlage ab und legt ihre jeweiligen Titel und Inhalte fest.
Meine Frage bezieht sich auf die oben genannten Dinge. Ich habe eine class="current".
Ich möchte die aktuelle Seite, auf der ich mich befinde, mit diesem Klassenattribut versehen.
Ich könnte in jeder Ansicht eine andere Variable wie current_page="about" setzen und dann einen Vergleich in der Vorlage mit {% ifequal %}
in jedem Klassenelement jedes Links durchführen, aber das scheint wie eine Duplizierung zu sein (wegen der zusätzlichen Ansicht Variable).
Gibt es einen besseren Weg? Vielleicht, wenn es eine Möglichkeit gibt, den Namen der Ansichtsfunktion zu erhalten, von der die Vorlage automatisch ausgefüllt wurde, würde ich die zusätzliche Variable nicht einstellen müssen? Auch scheint es wie eine Menge ifequals.
Hier ist ein eleganter Weg, dies zu tun, den ich irgendwo kopiert habe und ich wünschte nur, ich könnte mich an den Ort erinnern, also könnte ich ihnen den Kredit geben. 8 -)
Ich weise jeder Seite (oder allen Seiten innerhalb einer Sektion) id
wie folgt zu:
Und dann ein id
für die entsprechenden Links:
Und im CSS habe ich eine Regel wie folgt festgelegt:
%Vor%Dies funktioniert also größtenteils deklarativ, um den Stil des Links zu steuern, zu dem die aktuelle Seite gehört. Sie können ihn hier in Aktion sehen: Ссылка
Es ist ein sehr sauberes und einfaches System, sobald Sie es eingerichtet haben, denn:
switch
-Anweisungen oder if / else / else
-Anweisungen Ich benutze Django nicht, aber dieses System funktioniert überall. In Ihrem Fall, wo Sie "ihre eigenen Titel und Inhalte festlegen", müssen Sie auch body id
einstellen, und es ist kein weiteres Django-Markup erforderlich.
Diese Idee erstreckt sich auch auf andere Situationen, z. "Ich möchte einen Download-Link in der Seitenleiste auf jeder Seite mit Ausnahme der Download-Seiten selbst." Sie können das in CSS so machen:
%Vor%, anstatt das bedingte Vorlagen-Markup in den Sidebar-HTML-Code einzufügen.
Ich sehe nur ein paar Möglichkeiten, dies zu tun und dabei wiederholte ifequals zu vermeiden:
Javascript. Etwas in der Art von (jQuery):
%Vor%Ändern Sie Ihre Ansichten so, dass sie eine Liste von Seiten mit den zugehörigen Titeln und URLs enthalten, und erstellen Sie in Ihrer Vorlage eine {% for%} - Schleife, die diese Liste durchsucht und ein einzelnes {% ifequal%} hinzufügt .
Option 2 ist der Favorit von wo ich stehe. Wenn die Logik für alle Ihre Seiten identisch ist und nur die Vorlagen unterschiedlich sind, können Sie das FlatPages-Modell für jede Ihrer Seiten verwenden. Wenn die Logik anders ist und Sie unterschiedliche Modelle benötigen, können Sie eine menuierende App verwenden. Ein schamloser Plug: Ich habe eine App mit eigener App
Wenn Sie den request
Kontextprozessor hinzufügen, ist das ziemlich einfach:
Sie haben nun Zugriff auf HttpRequest
, das den Anfragepfad enthält. Beim Markieren der aktuellen Seite muss lediglich überprüft werden, ob der Pfad mit dem Ziel der Verknüpfung übereinstimmt, d. H. Sie sind bereits dort:
Tags und Links django django-templates django-urls