Шаблон Django для цикла, повторяющего два элемента - PullRequest
2 голосов
/ 24 сентября 2011

Я пытаюсь реализовать forloop в tempalte Django, повторяя два элемента за цикл так, чтобы

{% for c in cList%}
<ul class="ListTable">
    <li>
         {{ c1.name }}
    </li>
    <li>
         {{ c2.name }}
    </li>

</ul>
{% endfor %}

Я знаю, что мой код не подходит для этого, но я все равно не смог найти. Я действительно ценю за любое предложение

Спасибо

Ответы [ 3 ]

6 голосов
/ 24 сентября 2011

Если вы можете контролировать структуру списка, которая является cList, почему бы вам просто не сделать ее списком из двух элементов или списком из двух элементов, например

#in the view
cList = [(ob1, ob2), 
         (ob3, ob4)]

и в шаблоне

{% for c1, c2 in cList %}

 <ul class="ListTable">
   <li>
     {{ c1.name }}
   </li>
   <li>
      {{ c2.name }}
   </li>
</ul>
 {% endfor %}

Также вы можете использовать функцию zip, чтобы облегчить создание cList, или определить функцию, которая создает структуру такого типа из списка объектов, например

def pack(_list):
    new_list = zip(_list[::2], _list[1::2])
    if len(_list) % 2:
        new_list.append((_list[-1], None))
    return new_list
1 голос
/ 21 июля 2017

Одним из вариантов является использование встроенного тега шаблона цикл

и сделайте что-то вроде:

{% for c in c_list %}
    {% cycle True False as row silent %}

    {% if row %}
        <ul class="ListTable">
    {% endif %}

        <li>
             {{ c.name }}
        </li>

    {% if not row or forloop.last %}
        </ul>    
    {% endif %}

{% endfor %}

Примечание: если у вас есть нечетное количество элементов в списке, в последней таблице будет только один элемент с этой опцией, поэтому мы проверяем forloop.last

0 голосов
/ 17 июля 2013

Я попытался реализовать решение cyraxjoe, которое работает, но есть только одна проблема с ним ...

a = [1,2,3] вернет [(1,2)], но удалит3.

Итак, я спросил в irc freenode #python решение, и я получил это:

it = iter(a); nested = [list(b) for b in itertools.izip_longest(it, it)]
print nested
[[1, 2], [3, None]]

Мне также сказали искать документацию для модуля itertools,и искать рецепт "групер".который делает что-то похожее, но я еще не пробовал.

Я надеюсь, что это помогает:)

* Кредиты для исключения и lvh из канала #python

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...