2012-07-26 20 views
5

(tl; altta dr)Django, şablonlar, döngüler için, ve döngüleri

bana başarmak çalışıyorum anlatmaya diyelim: İki boyutlu bir diziyi var ve görüntülemek istediğiniz İçeriği belli bir şekilde. "Satırlar" istiyorum ve her satır daha iyi bir kelime olmaması için üçten fazla "nesne" gösteremez. Bu yüzden, dizi üzerinde yinelemeyi ve süreçteki HTML'imi oluşturmak istiyorum. Benim fikrim şudur: dizideki her "ilk üç" elementin "satır" açması gerekir. Her üç "elemanın üçte biri", "satır" ı kapatmalıdır. Bununla birlikte, eğer [iç] dizideki son eleman "üçüncünün üçte biri" olmazsa, yine de satırı kapatmalıdır. Biz L=[ [0,1,2,3,4], [5,6,7] ] gibi bir şey olsaydı Yani, örneğin, ben şöyle görüntülemek isteyeyim: gibi işaretlenmiş olabilir

0 1 2 
3 4 

5 6 7 

: İlk düşüncem sadece kullanmaktı

<div>0 1 2</div> 
<div>3 4</div> 
<div>5 6 7</div> 

modulo operatörü ve her bir yinelemenin bir satırın "ilk", "ikinci" veya "üçüncü" olup olmadığına bakın, ancak Django şablonları modulo'yu doğrudan desteklemez (daha sonra bunun üzerine).

Yani böyle şablon kodu ile geldi:

{% for x in L %} 
{% for y in x %} 
    {% cycle '<div>' '' '' %} 
    {{ y }} 
    {% cycle '' '' '</div>' %} 
{% endfor %}<br/> 
{% endfor %} 

Ve bu iyi bir başlangıç ​​oldu. Yukarıdaki örnekte, 0'da, 1 no'lu bir div açacağız, 2'da, 3 numaralı pencereyi kapatın ve 4 ... iyi, kapanmayacaktır, çünkü 4 "üçüncü" 3 bir dizi ". Yani Django şablonları modulo yok iken, onlar bir divisibleby çek var, bu yüzden döngü [iç] son ​​unsuru vurursan ben söylemek ek mantığı ile geldi ve aynı zamanda 3 ile bölünebilir değildir

{% for x in z %} 
{% for y in x %} 
    {% cycle '<div>' '' '' %} 
    {{ y }} 
    {% cycle '' '' '</div>' %} 

    {% if forloop.last %} 
    {% if forloop.counter|divisibleby:"3" %} 
    <!-- Row Already Closed --> 
    {% else %} 
    </div> 
    {% endif %} 
    {% endif %} 

{% endfor %}<br/> 
{% endfor %} 

Bu iyi çalıştı: (bu yüzden yinelenen yakın yok), sonra div kapatın! Şimdi, ilk iç diziyi doğru işaretleme ile aldım. Sorunum şuydu: Görünüşe göre, Django'nun döngü işlevselliği, iç döngü kapsamının dışına çıktığınızda sıfırlanmaz. Ne bu, yukarıdaki örnekteki benim bir numaralı 5 bir div olması gerektiği gibi açılmıyor demektir, bu bir döngüde ilk olarak kabul edilmesi değildir. Aslında, aslında üçte biri olarak kabul ediliyor ve bu yüzden bir div kapıyor!

Yani Buradan nereye gitmek emin değilim. Bu bir known and unfixed issues in Django olarak görünüyor. Yardımcı olabilir misiniz, lütfen?

tl, dr bir 2d dizi çekmek istiyoruz, ör L=[ [0,1,2,3,4], [5,6,7] ] ve düzgün şöyle bir seferde ve birlikte birden dizilerden herhangi elemanları gruplama olmadan 3'ten fazla gruplama, işaretlemek:

0 1 2 
3 4 

5 6 7 

Bu ne ve neden için şablon kodu olurdu?

cevap

14

Sen <div> etiketi açmak için ve </div> etiketi kapatmak için zaman {% if forloop.last or forloop.counter|divisibleby:"3" %} belirleme zamanı belirlemek için {% if forloop.counter0|divisibleby:"3" %} kullanmak mümkün olmalıdır.

{% for x in z %} 
{% for y in x %} 
    {% if forloop.counter0|divisibleby:"3" %}<div>{% endif %} 
    {{ y }} 
    {% if forloop.last or forloop.counter|divisibleby:"3" %}</div>{% endif %} 
{% endfor %}<br/> 
{% endfor %} 
+0

Mükemmel, teşekkür ederim! – Joseph

İlgili konular