2017-10-04 89 views
0

我有两个列表:Django模板:使嵌套循环内子循环做一定数量的迭代

list1 = ['a','b','c','d'] 
list2 = [1,2,3,4,5,6,7,8,9,10,11,12] 

我想将它们呈现到模板如下:

a 1 2 3 
b 4 5 6 
c 7 8 9 
d 10 11 12 

因此,带有字母(list1)的第一列是行索引。每行由从list2填充的3个单元组成。

模板结构如下:

<div class="row"> 
    <div class="row-index">row index from list1</div> 
    <div class="cell">cell1 from list2</div> 
    <div class="cell">cell2 from list2</div> 
    <div class="cell">cell3 from list2</div> 
</div> 

显然,这是不够的,在这里做一个简单的嵌套嵌套循环(对于list1list2):

{% for row_index in list1 %} 
    <div class="row"> 
     <div class="row-index">{{ row_index }}</div> 
     {% for cell in list2 %} 
     <div class="cell">{{ cell }}</div> 
     {% endfor %} 
    </div> 
{% endfor %} 

这将使得4行(这是正确的!),但每行将有12个单元,而不是每行3个。

不幸的是,zip_longest(list1, list2)将无济于事,因为它增加了额外的'None'元素到list1,使其与list2的长度相等。结果是4个实际行索引,其后是8个空行索引。所渲染的单元格对于每个单独的行都是相同的,例如, "a 1 1 1""b 2 2 2"

在Django模板中是否有任何方式强制子循环(在嵌套循环内部)每次迭代其父循环只进行3次迭代?

回答

0

将较长的列表拆分为块。你可以随意挑选从答案this question,例如:

def chunks(l, n): 
    """ 
    Yield successive n-sized chunks from l. 
    code from https://stackoverflow.com/a/312464/113962 
    """ 
    for i in range(0, len(l), n): 
     yield l[i:i + n] 

拉链短名单,并分块列表一起。

list1 = ['a','b','c','d'] 
list2 = [1,2,3,4,5,6,7,8,9,10,11,12] 
chunked = chunks(list2, 3) 
zipped_lists = zip(list1, chunked) 

然后通过模板的压缩列表,例如循环:

{% for x, chunk in zipped_list %} 
{{ x }} {% for y in chunk %}{{ y }} {% endfor %} 
{% endfor %} 
0

你看着the forloop counter

{% for row_index in list1 %} 
    <div class="row"> 
     <div class="row-index">{{ row_index }}</div> 
     {% for cell in list2 %} 
      {% if forloop.counter < 4 %} 
       <div class="cell">{{ cell }}</div> 
      {% endif %} 
     {% endfor %} 
    </div> 
{% endfor %}