Django, szablony, pętle i cykle
(tl; dr na dole)
Pozwól mi spróbować wyjaśnić, co próbuję osiągnąć: Mam dwuwymiarową tablicę i chciałbym wyświetlić jej zawartość w określony sposób. Chcę „wierszy”, a każdy wiersz może wyświetlać nie więcej niż trzy „obiekty” z braku lepszego słowa. Chcę więc iterować po tablicy i utworzyć mój kod HTML w tym procesie. Mój pomysł jest następujący: każdy „pierwszy z trzech” elementów w tablicy powinien otworzyć „wiersz”. Każdy „trzeci z trzech” elementów powinien zamknąć „wiersz”. Jeśli jednak ostatni element w tablicy [wewnętrzna] nie jest „trzecią z trzech”, powinien nadal zamknąć wiersz. Na przykład, gdybyśmy mieli coś takiegoL=[ [0,1,2,3,4], [5,6,7] ]
, Chciałbym to wyświetlić tak:
0 1 2
3 4
5 6 7
Które mogą być oznaczone jak:
<div>0 1 2</div>
<div>3 4</div>
<div>5 6 7</div>
Moją pierwszą myślą było po prostu użycie operatora modulo i sprawdzenie, czy każda iteracja była „pierwszą”, „drugą” lub „trzecią” rzędu, ale szablony Django nie obsługują bezpośrednio modulo (więcej na ten temat później).
Więc wymyśliłem kod szablonu w ten sposób:
{% for x in L %}
{% for y in x %}
{% cycle '<div>' '' '' %}
{{ y }}
{% cycle '' '' '</div>' %}
{% endfor %}<br/>
{% endfor %}
I to był dobry początek. Biorąc powyższy przykład, dalej0
otworzylibyśmy div, na1
nic nie rób2
zamknij div, włączony3
otwórz i włącz4
... cóż, nie zamknie się, bo4
nie był „trzecim z serii 3”. Tak więc, podczas gdy szablony Django nie mają modulo, mają sprawny podział, więc wymyśliłem dodatkową logikę do powiedzenia, jeśli trafimy na ostatni element pętli [wewnętrzny] for, a także nie jest on podzielny przez 3 (więc nie mamy duplikatu), a następnie zamknij 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 %}
To działało lepiej! Teraz przeszedłem przez całą pierwszą wewnętrzną tablicę z odpowiednim znacznikiem. Mój problem jest następujący: najwyraźniej funkcja cyklu Django nie resetuje się, gdy wychodzisz z zakresu wewnętrznej pętli for. Co to znaczy, mój numer5
z powyższego przykładu nie otwiera diva tak, jak powinien, nie jest rozpoznawany jako pierwszy w cyklu. W rzeczywistości jest rozpoznawany jako trzeci, a więc zamyka div!
Więc nie jestem pewien, dokąd stąd się udać. To wydaje się byćznane i nieustalone problemy w Django. Czy ktoś może pomóc?
tl; dr Chcę wziąć tablicę 2d, np.L=[ [0,1,2,3,4], [5,6,7] ]
i odpowiednio oznacz to grupowanie nie więcej niż 3 na raz i bez grupowania elementów z wielu tablic razem, tak:
0 1 2
3 4
5 6 7
Jaki byłby kod tego szablonu i dlaczego?