Django, шаблоны, циклы for и циклы

(tl;dr внизу)

Позвольте мне объяснить, что я пытаюсь сделать :У меня есть двумерный массив, и я хотел бы отобразить его содержимое определенным образом. Мне нужны «строки», и каждая строка может отображать не более трех «объектов», за неимением лучшего слова. Итак, я хочу перебрать массив и создать свой HTML в процессе. Моя идея заключается в том, что :каждый «первый из трех» элементов в массиве должен открывать «строку». Каждый «третий из трех» элементов должен замыкать «ряд». Однако, если последний элемент в массиве [inner] не является «третьим из трех», он все равно должен закрыть строку. Так, например, если бы у нас было что-то вроде L=[ [0,1,2,3,4], [5,6,7] ], я бы хотел отобразить это так:

0  1  2
3  4

5  6  7

Который может быть размечен как:

0 1 2
3 4
5 6 7

Моей первой мыслью было просто использовать оператор по модулю и посмотреть, была ли каждая итерация «первой», «второй» или «третьей» в строке, но шаблоны Django напрямую не поддерживают модуль по модулю (, подробнее об этом позже ).

Поэтому я придумал такой код шаблона:

{% for x in L %}
 {% for y in x %}
  {% cycle '
' '' '' %} {{ y }} {% cycle '' '' '
' %} {% endfor %}
{% endfor %}

И это было хорошее начало. Взяв приведенный выше пример, в 0мы бы открыли div, в 1ничего не делали, в 2закрыли div, в 3открыли его, а в 4… ну, это не t близко, потому что 4не был «третьим в серии из 3». Так,в то время как шаблоны Django не имеют модуля, у них есть проверка на деление на, поэтому я придумал дополнительную логику, чтобы сказать, если мы нажмем последний элемент [внутреннего] цикла for, и он также не делится на 3 (поэтому у нас нет дубликата close ), затем закройте div:

{% for x in z %}
 {% for y in x %}
  {% cycle '
' '' '' %} {{ y }} {% cycle '' '' '
' %} {% if forloop.last %} {% if forloop.counter|divisibleby:"3" %} {% else %}
{% endif %} {% endif %} {% endfor %}
{% endfor %}

Это сработало лучше! Теперь я прошел весь первый внутренний массив с правильной разметкой. Моя проблема заключается в следующем :, по-видимому, функциональность цикла Django не сбрасывается, когда вы выходите за рамки внутреннего цикла for. Это означает, что мой номер 5из приведенного выше примера не открывает div должным образом, он не распознается как первый в цикле. Фактически, он распознается как третий, и поэтому он закрывает div!

Так что я не уверен, куда идти отсюда. Похоже, это известные и неисправленные проблемы в Django . Кто-нибудь может помочь, пожалуйста?

tl;dr Я хочу взять двумерный массив, например. L=[ [0,1,2,3,4], [5,6,7] ]и правильно разметить его, группируя не более 3 за раз и не группируя вместе какие-либо элементы из нескольких массивов, например:

0  1  2
3  4

5  6  7

Каким будет код шаблона для этого и почему?

5
задан Joseph 26 July 2012 в 23:18
поделиться