2012-08-15 21 views
14

ben şablonda koleksiyonunu temsil etmek veDjango şablon her 4. eleman

<li></li> 

her dört elementi kaydırmak için gereken etiket eklemek li {% için%} şablonu böyle olmalı:

<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> 

Yani ben size divisibleby yerleşik filtre, here is link to django documentation 01 kullanabilirsiniz {% için%} içinde

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

cevap

47

kullanarak, sorunu çözmek gerekir aşağıdaki yerleşik şablon etiketleri: önce belirtildiği gibi

<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

Bir koşul yerine getirildiğinde, kapatma etiketlerini enjekte etmenin bu usul şeklini gerçekten sevmiyorum. Çok daha okunabilir ve tekrar kullanılabilir bir çözüm için http://stackoverflow.com/a/11965885/636626 adresine bakın. –

+0

@NilsWerner: Çözümün kullanım durumu için geçerli olup olmadığına bağlıdır. Hedde'nin çözümü mevcut bir çok kodu ve/veya altyapı değiştirmenizi gerektiriyorsa, gene de bir jeneratör nesnesine kıyasla yassı bir liste ile uğraşmanın "daha kolay rotası" için gitmek daha uygun olabilir. Ayrıca, listenin gruplandığı kaç öğenin sorumluluğu arayan kişiye aktarılmıştır. Bunun istenen yol olup olmadığı, kullanım durumuna bağlıdır.Bununla birlikte, daha temiz şablonlar ve yeniden kullanılabilir çözümler için çaba göstermenin uygun olduğuna katılıyorum. – Manuzor

3

yapmama gerek yüzden böyle bir şey ben şahsen döngüler için yuvalanmış şablonuna geçirerek ve sonra kullanmadan önce görünümde unsurları ayırmak için dikkate alacağını

{% if value|divisibleby 4 %} 
#your conditional code 
{% endif %} 
1

çalışacak. Bunun dışında Vaibhav Mishra'nın bahsettiği gibi sadece filtre veya şablon etiket seçeneğine sahipsiniz.

+0

olanlar 4 nesneler aslında ilk etapta birbirlerine ait değilse, yaklaşımınız mantığı görsel temsile yaklaştırır. Tasarımcılar ve Programcılar ayrı çalışabilmeli, bu django'nun hedeflerinden bir tanesidir. – Manuzor

+1

Django gibi çerçeveler, kişinin gereksinimlerine göre bükülme anlamına gelir, eğer imge nesneleri gruplamaksa, bunu görüntü katmanında yapmak gayet iyi. Elbette tasarımcının hayatını kolaylaştırırsa. Örneğin. sıralama, genellikle şablon katmanının dışında da yapılır. –

+0

@Hedde Kısmen katılıyorum. Bu nesneleri, sabit 4 kümesi (örn., Düz bir ad listesi) olarak ortak bir noktaya göre gruplayamamanız mümkün olabilir. Tasarımcı, yalnızca verilerin kullanıcıya daha kompakt bir şekilde sunulmasını hedefleyebilir. Ancak, veriler her zaman birlikte gruplandırılmalıdır ** çünkü bunlar birbirine aittir ** (diyelim ki dizi [isim0, soyadı0, adres0, telefon0, isim1, .., isimN, ..] gibi), gerçekten Bu görünüm katmanında yapılmalıdır. En azından bu, görüşün (programcı) ve şablonun (tasarımcı) ayrılmasını nasıl anladığımdur. – Manuzor

13

Sen divisibleby etiketini kullanabilirsiniz, ancak şablon temizleme amaçlı Genellikle bir jeneratör döndüren bir yardımcı işlevi tercih :

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

örneğin basit görünüşüdür:

from app.helpers import grouped 

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

örnek şablonu:

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

Sadece harika! Bu, en basit, en temiz ve en okunaklı çözümdür. +1 –

+0

Teşekkürler bu harika – Cody

0

ilk forloop kontrol ile çalışmak istiyorsanız ve son forloop bunu kullanabilirsiniz:

<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> 
İlgili konular