Wie genau zu vertreten, wenn / else CSS-Klassen in Django-Vorlagen angeben

In einer Django-Vorlage möchte ich CSS-Klassen zu einem DIV auf der Grundlage bestimmter "Bedingungen" hinzufügen, zum Beispiel:

<div class="pkg-buildinfo {% if v.release.version == pkg.b.release.version %}active{% else %}inactive{% endif %} {% if v.release.version == project.latest.version %}latest{% else %}notlatest{% endif %}"> 

( Beachten Sie, dass v eine Schleifenvariable ist, die ganze Sache ist innerhalb einer for Schleife)

Die oben genannten addiert CSS-Klassen "aktiv" oder "inaktiv" und "spätestens" oder "notlatest" auf der Grundlage von zwei Bedingungen.

Das ist aber schwer zu lesen und zu vergleichen. Ich entdeckte, dass die with Aussage nicht die Zuweisung des Wertes von Ausdrücken / Bedingungen (im Gegensatz zu komplexen Variablen), die schade ist. Gibt es einen besseren Weg, dies zu tun?

  • So platzieren Sie den Datensatz
  • Gibt es einen Filter in Django, um Sternchen (*) anstelle von Text anzuzeigen
  • Zugriff auf ein Dict von Variable in Django Vorlagen?
  • Ändere HTML mit Variablen in Django
  • Zusammenfassend in einer Django-Vorlage
  • Webapp2, Jinja2: wie man große html-Datei in mehrere HTML-Dateien schneiden
  • Django: Wie kann ich ein Formular bei der Verwendung von Nicht-Modelldaten vorfüllen?
  • Django / jQuery: Handling Template Vererbung und JS-Dateien laden
  • 3 Solutions collect form web for “Wie genau zu vertreten, wenn / else CSS-Klassen in Django-Vorlagen angeben”

    Sie könnten diese Logik stattdessen in Ihre Ansicht setzen und Attribute auf dem Objekt erstellen, die "aktiv" oder "inaktiv" usw. sind. Dann müssen Sie nur auf die Attribute in der Vorlage zugreifen.

    Ein benutzerdefinierter Filter könnte eine schöne Alternative sein.

     @register.filter def active_class(obj, pkg): if obj.release.version == pkg.b.release.version: return 'active' else: return 'inactive' 

    Und benutze es in deiner Vorlage:

     <div class="pkg-buildinfo {{ obj|active_class:pkg }}" 

    Du kannst es ein bisschen verkürzen?

     {% with v.release.version as version %} <div class="pkg-buildinfo {% if version == pkg.b.release.version %}active{% else %}inactive{% endif %} {% if version == project.latest.version %}latest{% else %}notlatest{% endif %}"> {% endwith %} 

    Aber es wäre sicher besser, diese Logik in die Ansicht zu stellen:

     context_data = { 'class_active': v.release.version == pkg.b.release.version and "active" or "inactive", 'class_latest': v.release.version == project.latest.version and "latest" or "notlatest", ... } 

    Und in der Vorlage:

     <div class="pkg-buildinfo {{ class_active }} {{ class_latest }}" 
    Python ist die beste Programmiersprache der Welt.