2011-12-13 23 views
86

Django'da modulus operatörü gibi bir şeyi kullanmanın bir yolunu arıyorum. Yapmaya çalıştığım şey, bir döngüdeki her dördüncü öğeye bir sınıf adı eklemektir.Django şablonunda% modül oranı

modülü sayesinde şu şekilde görünecektir:% ayrılmış bir karakter olduğu için

{% for p in posts %} 
    <div class="post width1 height2 column {% if forloop.counter0 % 4 == 0 %}first{% endif %}}"> 
     <div class="preview"> 

     </div> 
     <div class="overlay"> 

     </div> 
     <h2>p.title</h2> 
    </div> 
{% endfor %} 

Tabii bu işe yaramaz. Bunu yapmanın başka bir yolu var mı?

+0

sen bile denediniz mi? Django, "templatetag" etiketini sağlar, ancak bu, {% ','%} ', vb. (' '' '' ') 'I kapsar. –

+4

Evet, denedim, ancak aşağıdaki hatayı alıyorum: Geri kalan bölümü ayrıştırılamadı: '%' den '%' Bunun farzedilmesinin nedeni, modülün nasıl ezileceğini bilmemesidir. Operatör ayrıca dokümanlar üzerinde de listelenmemiş. Https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#operator – underdoeg

cevap

162

Dahili django filtresi olan divisibleby'a ihtiyacınız var.

{% for p in posts %} 
    <div class="post width1 height2 column {% if forloop.counter0|divisibleby:4 %}first{% endif %}"> 
     <div class="preview"> 

     </div> 
     <div class="overlay"> 

     </div> 
     <h2>p.title</h2> 
    </div> 
{% endfor %} 
+3

+1. 'Divisibleby' hakkında unuttum, bu da harika bir seçenek olur. – mipadi

+0

ah evet, tam olarak bu. şimdi döngüsü kullanarak, ancak gelecekteki referans için iyi. Modulor 100 ya da bir şey ile döngü kullanmak istemiyorum :) Aslında bu cevabı doğru olanı olarak işaretlemek için gidiyorum. modulor'a odaklandığından ve bir geçici çözüm olmadığı için ... – underdoeg

11

Modül işlecini Django şablon etiketlerinde kullanamazsınız, ancak bunu yapmak için bir filtre yazmak yeterince kolay olacaktır. Böyle bir şey çalışması gerekir: o zaman

@register.filter 
def modulo(num, val): 
    return num % val 

Ve: Sonra

@register.filter 
def modulo(num, val): 
    return num % val == 0 

Ve:

{% if forloop.counter0|modulo:4 %} 

{% ifequal forloop.counter0|modulo:4 0 %} 

yerine böyle bir şey yapmak bile olabilir

Yoksa cycle etiketi kullanabilirsiniz: Sadece döngü etiketi kullanmalıdır gibi

<div class="post width1 height2 column {% cycle 'first' '' '' '' %}"> 
3

Önyükleme satırları ve sütunları örneği. Her 4 öğede yeni satır. Ayrıca 4'ten az öğe olsa bile son satırı kapatın.

myapp/templatetags/my_tags.py

from django import template 

register = template.Library() 

@register.filter 
def modulo(num, val): 
    return num % val 

html şablonu

{% load my_tags %} 

{% for item in all_items %} 
    {% if forloop.counter|modulo:4 == 1 %} 
     <div class="row"> 
    {% endif %} 

     <div class="col-sm-3"> 
      {{ item }} 
     </div> 

    {% if forloop.last or forloop.counter|modulo:4 == 0 %} 
     </div> 
    {% endif %} 

{% endfor %} 
+2

Bu, daha iyi bir cevaptır, çünkü gerekli dizinin oluşturulmasını tanımlar ve özel şablonu şablon html'ye de yükleme gereksinimini açıklar. Teşekkür ederim. – ifelsemonkey

İlgili konular