Django şablonundaki modül%


121

Django'da modül operatörü gibi bir şey 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.

Modülüs ile şöyle görünür:

{% 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 %}

Elbette bu işe yaramıyor çünkü% ayrılmış bir karakter. Bunu yapmanın başka bir yolu var mı?


Denedin mi hiç? Django sağlar templatetagetiketi, ama içeriği bu {%, %}vb (değil %).
Platinum Azure

4
evet, denedim, ama şu hatayı alıyorum: Kalan ayrıştırılamadı: '%' '%' dan Modülörü nasıl parçalayacağını bilmediği için olduğunu varsayıyorum. Operatör ayrıca docs.djangoproject.com/en/dev/ref/templates/builtins/…
underdoeg

Yanıtlar:


210

Sen gerek divisibleby , yerleşik bir Django filtresi.

{% 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 %}

1
ah evet, aynen öyle. şimdi döngüyü kullanıyor, ancak ileride başvurmak için iyi. Döngüyü 100 modülüyle falan kullanmak istemem :) Aslında bu yanıtı doğru olarak işaretlemeye gidiyorum. çünkü geçici bir çözüm değil,
modüle

15

Modül işlecini Django şablon etiketlerinde kullanamazsınız, ancak bunu yapmak için bir filtre yazmak yeterince kolay olacaktır. Bunun gibi bir şey çalışmalı:

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

Ve sonra:

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

Bunun yerine bunun gibi bir şey bile yapabilirsiniz:

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

Ve sonra:

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

Veya cycleetiketi kullanabilirsiniz :

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


12

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

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ü hangi dizinin oluşturulması gerektiğini açıklar ve özel şablonu html şablonuna yükleme ihtiyacını da açıklar. Teşekkür ederim.
truthadjustr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.