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.