2012-08-15 82 views
14

我要代表集合中的模板,敷在Django的模板{%用於%}標籤附加李每4個元素

<li></li> 

,每四個元素的模板應該是這樣的:

<ul> 
    <li> 
     <a></a> 
     <a></a> 
     <a></a> 
     <a></a> 
    </li> 
    <li> 
     <a></a> 
     <a></a> 
     <a></a> 
     <a></a> 
    </li> 
    <li> 
     <a></a> 
     <a></a> 
     <a></a> 
     <a></a> 
    </li> 
</ul> 

所以我需要做的是在{%用於%}

{% for obj in objects %} 
{#add at 1th and every 4th element li wrap somehow#} 
    <a>{{object}}</a> 
{# the same closing tag li#} 
{% endfor %} 

回答

47

以下應該解決您的問題,使用內置的模板標籤:

<ul> 
    <li> 
    {% for obj in objects %} 
     <a>{{ obj }}</a> 

    {# if the the forloop counter is divisible by 4, close the <li> tag and open a new one #} 
    {% if forloop.counter|divisibleby:4 %} 
    </li> 
    <li> 
    {% endif %} 

    {% endfor %} 
    </li> 
</ul> 
+0

當條件滿足時,我真的不喜歡注入閉合標籤的程序方式。請參閱http://stackoverflow.com/a/11965885/636626的響應,以獲得更具可讀性和可重用性的解決方案。 – 2016-03-02 11:47:17

+0

@NilsWerner:取決於解決方案是否適用於用例。如果Hedde的解決方案要求您修改大量現有的代碼和/或基礎架構,那麼與處理生成器對象相比,仍然可以採用處理平面列表的「更簡單的路線」更爲可行。此外,清單分組數量的責任已轉移給主叫方。這是否是所需的方式取決於用例。話雖如此,我同意爭取更清潔的模板和可重複使用的解決方案是可取的。 – Manuzor 2016-03-13 16:04:18

1

我個人會考慮將它們傳遞給模板,然後使用嵌套的for循環之前,在視圖中的元素分開。除此之外,你真的只有Vaibhav Mishra提到的過濾器或模板標籤選項。

+0

如果這些4個對象實際上並不在首位屬於一起,你的方法會將邏輯更緊密地結合到視覺表示上。設計師和程序員應該能夠分開工作,這是django的目標之一。 – Manuzor 2012-08-15 07:01:31

+1

框架,就像Django一樣,是爲了滿足自己的需求,如果需要將對象分組,那麼在視圖層中完成這項工作是完全正確的。當然,如果它讓設計師的生活更輕鬆。例如。排序也通常在模板層之外完成。 – 2012-08-15 08:18:30

+0

@Hedde我同意,部分。儘管如此,你可能無法將這些對象按固定的4(例如一個普通的名稱列表)作爲共同的東西來分組。設計者可能只是瞄準爲用戶提供更緊湊的數據表示。但是,如果數據必須始終組合在一起**,因爲它們屬於一起**(例如,數組看起來像[name0,surname0,address0,phone0,name1,..,nameN,..]),那麼確實這應該在視圖層完成。至少這是我如何理解視圖(程序員)和模板(設計師)的分離。 – Manuzor 2012-08-15 11:30:12

13

您可以使用divisibleby標籤如前面提到的,但對於模板清算目的,我通常喜歡它返回一個發電機的輔助功能:

def grouped(l, n): 
    for i in xrange(0, len(l), n): 
     yield l[i:i+n] 

例如簡單的觀點:

from app.helpers import grouped 

def foo(request): 
    context['object_list'] = grouped(Bar.objects.all(), 4) 
    return render_to_response('index.html', context) 

示例模板:

{% for group in object_list %} 
    <ul> 
     {% for object in group %} 
      <li>{{ object }}</li> 
     {% endfor %} 
    </ul> 
{% endfor %} 
+0

只是輝煌!這是迄今爲止最簡單,最乾淨和最可讀的解決方案。 +1 – 2015-09-11 02:33:12

+0

非常感謝 – Cody 2017-02-27 16:58:58

0
如果你想檢查第一for循環去解決它

和最後一個for循環,你可以這樣做:

<ul> 
{% for obj in objects %} 
{% if forloop.first %} 
    <li> 
{% endif %} 
     <a>{{obj}}</a> 
{% if forloop.counter|divisibleby:4 and not forloop.first %} 
    </li> 
    <li> 
{% endif %} 
{% if forloop.last %} 
    </li> 
{% endif %} 
{% endfor %} 
</ul>