Django, Vorlagen für Loops und Zyklen

(tl; dr unten)

Lassen Sie mich erklären, was ich erreichen möchte: Ich habe ein zweidimensionales Array und möchte dessen Inhalt auf eine bestimmte Weise darstellen. Ich möchte "Zeilen", und jede Zeile kann nicht mehr als drei "Objekte" anzeigen, da es kein besseres Wort gibt. Ich möchte also das Array durchlaufen und dabei meinen HTML-Code erstellen. Meine Idee ist folgende: Jedes "erste von drei" Elementen im Array sollte die "Zeile" öffnen. Jedes "dritte von drei" Elementen sollte die "Zeile" schließen. Wenn das letzte Element im [inneren] Array jedoch nicht das "dritte von drei" ist, sollte die Zeile trotzdem geschlossen werden. Also zum Beispiel, wenn wir so etwas hättenL=[ [0,1,2,3,4], [5,6,7] ]Ich würde es so anzeigen wollen:

0  1  2
3  4

5  6  7

Was könnte wie folgt markiert sein:

<div>0 1 2</div>
<div>3 4</div>
<div>5 6 7</div>

Mein erster Gedanke war, einfach den Modulo-Operator zu verwenden und zu prüfen, ob jede Iteration das "erste", "zweite" oder "dritte" einer Zeile war, aber Django-Vorlagen unterstützen Modulo nicht direkt (dazu später mehr).

Also habe ich mir folgenden Vorlagencode ausgedacht:

{% for x in L %}
 {% for y in x %}
  {% cycle '<div>' '' '' %}
   {{ y }}
  {% cycle '' '' '</div>' %}
 {% endfor %}<br/>
{% endfor %}

Und das war ein guter Anfang. Nehmen wir das obige Beispiel auf0 wir würden ein div eröffnen, am1 nichts tun, auf2 schließe das div, auf3 öffne es und weiter4... nun, es würde nicht schließen, weil4 war nicht der "dritte in einer Serie von 3". Während Django-Templates kein Modulo haben, haben sie eine Teilbarkeit durch Prüfung, daher habe ich eine zusätzliche Logik entwickelt, um zu sagen, ob wir das letzte Element der [inneren] for-Schleife treffen und es auch nicht durch 3 teilbar ist (also haben wir kein Duplikat close), dann schließe das div:

{% for x in z %}
 {% for y in x %}
  {% cycle '<div>' '' '' %}
   {{ y }}
  {% cycle '' '' '</div>' %}

  {% if forloop.last %}
  {% if forloop.counter|divisibleby:"3" %}
    <!-- Row Already Closed -->
  {% else %}
    </div>
  {% endif %}
  {% endif %}

 {% endfor %}<br/>
{% endfor %}

Das hat besser funktioniert! Jetzt habe ich das gesamte erste innere Array mit dem richtigen Markup durchlaufen. Mein Problem ist folgendes: Anscheinend wird Djangos Cycle-Funktionalität nicht zurückgesetzt, wenn Sie den Gültigkeitsbereich der inneren for-Schleife verlassen. Das heißt, meine Nummer5 Wenn Sie im obigen Beispiel ein Div nicht wie gewünscht öffnen, wird es nicht als erstes in einem Zyklus erkannt. Tatsächlich wird es als drittes erkannt und schließt eine Div!

Ich bin mir also nicht sicher, wohin ich von hier aus gehen soll. Dies scheint eine zu seinbekannte und unbekannte Probleme in Django. Kann jemand helfen, bitte?

tl; dr Ich möchte ein 2D-Array nehmen, z.L=[ [0,1,2,3,4], [5,6,7] ] und markieren Sie es richtig, indem Sie nicht mehr als 3 gleichzeitig gruppieren und keine Elemente aus mehreren Arrays zusammen gruppieren, wie folgt:

0  1  2
3  4

5  6  7

Was wäre der Vorlagencode dafür und warum?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage