2012-07-04 85 views
4

我想在django模板中爲給定條件執行減少forloop.counter的值,是否可以在django中使用。在django模板中對forloop.counter執行加法運算

下面是展示了示例

{% for i in item %} 
    {% if forloop.counter0|divisibleby:4 %} 
     Start 
    {% endif %} 
     {% if i %} 
      item{{ forloop.counter }} 
     {% else %} 
      ######### Here I want to reduce value of forloop.counter by 1 ########### 
     {% endif %} 
    {% if forloop.counter|divisibleby:4 %} 
     End 
    {% endif %} 

{% endfor %} 

在上述代碼爲8完美的項目輸出將是

Start 
item1 
item2 
item3 
item4 
End 
Start 
item5 
item6 
item7 
item8 
End 

但假設ITEM2是無,則輸出是

Start 
item1 
item3 
item4 
End 
Start 
item5 
item6 
item7 
item8 
End 

我希望以正確的升序形式打印(通過減少值在每一步增加1)如果條件不滿足,則每次都要進行forloop。請不要建議自定義模板標籤,我知道這一點,我認爲這是最後一個選項。

+1

您是否已通過'add'過濾器通過使用參數'-1'來嘗試? – Ahsan

+1

將使用add:-1將forloop.counter值減1。 –

回答

2

我真懷疑Django將讓你惹forloop.counter,很容易,也不會亂用也無妨。顯而易見的解決方案是在迭代之前過濾掉列表,這可以在您的視圖中完成,或者(如果您堅持在模板中執行)使用自定義過濾器。

或者你可以用在發電機的功能,將採取過濾和編號的照顧,即您的列表:再次

def filteriternum(seq): 
    num = 0 
    for item in seq: 
     if not item: 
      continue 
     num += 1 
     yield num, item 

在這裏,你可以做包裝在您的視圖或編寫自定義模板過濾器的標籤,將做包裝。

+0

我認爲這樣做,但迭代長列表使兩次迭代無論是在視圖中還是在模板中使用過濾器 –

+0

@ParitoshSingh然後將您的列表包裹在過濾器中(或重新編號)生成器 –

+0

@PititoshSingh:參考編輯答案的例子。 –

-2

如果Django的模板不能滿足,嘗試寫一個youself,點擊這裏django custom template tag

+0

我想知道在django中是否有可能,當然這對我來說是最後的選擇。 –

+0

請參閱有關編輯 –

+0

請再次看到問題..! –

1

也許是這樣的:

這裏是輸出:

Start 
item1 
empty item2 
item3 
item4 
End 
Start 
item5 
item6 
item7 
item8 
End 

UPDATE:我發現了一些真的搞笑,如何實際使用遞減一個「本地」變量forloop.counter:

{% cycle 0 -1 -2 -3 -4 -5 -6 -7 -8 -9 as dec %} 

{% for i in item %} 
    {% cycle 'Start' '' '' '' %} 
    {% if i %} 
     item{{ forloop.counter|add:dec }} 
    {% else %} 
     <!-- empty {% cycle dec %} here we move to the next decrementing value --> 
    {% endif %} 
    {% cycle '' '' '' 'End' %} 
{% endfor %} 
+0

對不起,我無法理解這裏的循環是如何工作的,而你又沒有得到2這是一個問題 –

+0

什麼是期望的輸出?我不確定我是否理解你想達到的目標。我已經更新了答案 - 現在檢查它。 – Tisho

+0

否@Tisho,看到最新的問題,它說數字應該增加1.現在你明白了我的觀點。 –

0

從Tisho的回答改編:

{% for i in item %} 
    {% if i %} 
     {% cycle 'Start' '' '' '' %} 
      item{% cycle 1 2 3 4 5 6 7 8 %} 
     {% cycle '' '' '' 'End' %} 
    {% endif %} 
{% endfor %} 

這將輸出:

Start 
item1 
item2 
item3 
item4 
End 
Start 
item5 
item6 
item7 
item8 
End 

所以沒有孔不再!但是這隻適用於數值有限的情況,因爲您必須將它們全部寫入第二個使用的cycle標籤...

相關問題