Django: Gibt es eine bessere Möglichkeit, den aktuellen Seitenlink zu fett zu machen?

7

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.

    
Net Citizen 21.06.2009, 15:37
quelle

4 Antworten

16

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:

%Vor%

Und dann ein id für die entsprechenden Links:

%Vor%

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:

  • Sie müssen sich nicht mit dem Template-Markup in Ihren Links herumschlagen
  • Sie verwenden nicht große hässliche switch -Anweisungen oder if / else / else -Anweisungen
  • Hinzufügen von Seiten zu einem Abschnitt Just Works [TM]
  • Die Art und Weise zu ändern, wie die Dinge aussehen, bedeutet immer nur, das CSS zu ändern, nicht das Markup.

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.

    
RichieHindle 21.06.2009, 16:01
quelle
2

Hab Django nicht benutzt, aber ich habe das gleiche Problem in Kohana (PHP) und Rails behandelt.

Was ich in Kohana mache:

%Vor%

Was ich in Rails mache:

%Vor%     
GeekJock 21.06.2009 16:41
quelle
1

Ich sehe nur ein paar Möglichkeiten, dies zu tun und dabei wiederholte ifequals zu vermeiden:

  1. Javascript. Etwas in der Art von (jQuery):

    %Vor%
  2. Ä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

    
oggy 21.06.2009 16:42
quelle
1

Wenn Sie den request Kontextprozessor hinzufügen, ist das ziemlich einfach:

%Vor%

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:

%Vor%     
jeberle 29.10.2013 22:41
quelle