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)

  • Django ORM: Nach Zusatzattribut filtern
  • Django Runserver, Import fehlschlägt - Projektname kapitalisiert?
  • Django Tutorial - falsch konfigurierte Ausnahme (pytz ist nicht installiert)
  • Wie erkennt man, ob das Skript von Django oder Befehlsaufforderung ausgeführt wurde?
  • Django erhalten die Summe der Stimmen pro Post
  • Django Mongoengine nicht in der Lage, MongoDB zu verbinden
  • 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?

    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.