Modulus% dalam templat Django

121

Saya mencari cara untuk menggunakan sesuatu seperti operator modulus di django. Apa yang saya coba lakukan adalah menambahkan nama kelas ke setiap elemen keempat dalam satu lingkaran.

Dengan modulus akan terlihat seperti ini:

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

Tentu saja ini tidak berhasil karena% adalah karakter yang sudah dipesan. Apakah ada cara lain untuk melakukan hal ini?.

underdoeg
sumber
Apakah Anda pernah mencobanya? Django menyediakan templatetagtag, tapi itu mencakup {%, %}, dll (tidak %).
Platinum Azure
4
ya, saya mencobanya, tetapi saya mendapatkan kesalahan berikut: Tidak dapat mengurai sisanya: '%' dari '%' Saya berasumsi itu karena tidak tahu cara memecah modulor. Operator juga tidak terdaftar di dokumen docs.djangoproject.com/en/dev/ref/templates/builtins/…
underdoeg

Jawaban:

210

Anda perlu membagi , filter django built-in.

{% 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 %}
Burhan Khalid
sumber
1
ah ya, memang begitu. menggunakan siklus sekarang, tetapi bagus untuk referensi di masa mendatang. Saya tidak ingin menggunakan cycle dengan modulor 100 atau sesuatu :) Sebenarnya saya ingin menandai jawaban ini sebagai jawaban yang benar. karena berfokus pada modulator dan bukan solusi ...
underdoeg
15

Anda tidak dapat menggunakan operator modulus dalam tag cetakan Django, tetapi akan cukup mudah untuk menulis filter untuk melakukannya. Sesuatu seperti ini seharusnya bekerja:

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

Lalu:

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

Anda bahkan dapat melakukan hal seperti ini, sebagai gantinya:

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

Lalu:

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

Atau Anda bisa menggunakan cycletag:

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

Contoh baris dan kolom bootstrap. Baris baru setiap 4 item. Juga tutup baris terakhir meskipun ada kurang dari 4 item.

myapp / templatetags / my_tags.py

from django import template

register = template.Library()

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

html

{% 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 %}
ab 16
sumber
2
Ini adalah jawaban yang lebih baik karena menjelaskan direktori yang dibutuhkan untuk dibuat dan menjelaskan kebutuhan untuk memuat template kustom di html template juga. Terima kasih.
kebenaranadjustr