2017-10-04 110 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 %}