Modulo% nel modello Django


121

Sto cercando un modo per usare qualcosa come l'operatore modulo in django. Quello che sto cercando di fare è aggiungere un nome di classe a ogni quarto elemento in un ciclo.

Con il modulo sarebbe simile a questo:

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

Ovviamente questo non funziona perché% è un carattere riservato. C'è un altro modo di fare questo?


L'hai anche provato? Django fornisce il templatetagtag, ma che copre {%, %}e così via (non %).
Platinum Azure

4
sì, l'ho provato, ma ottengo il seguente errore: Impossibile analizzare il resto: '%' da '%' presumo sia perché non sa come pareggiare il modulor. L'operatore inoltre non è elencato nella documentazione docs.djangoproject.com/en/dev/ref/templates/builtins/…
underdoeg

Risposte:


210

Hai bisogno di divisibleby , un filtro django integrato.

{% 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 sì, è proprio così. usando il ciclo ora, ma buono per riferimento futuro. Non vorrei usare il ciclo con il modulo 100 o qualcosa del genere :) In realtà sto per contrassegnare questa risposta come quella corretta. perché si concentra sul modulor e non su una soluzione alternativa ...
underdoeg

15

Non è possibile utilizzare l'operatore modulo nei tag del modello Django, ma sarebbe abbastanza facile scrivere un filtro per farlo. Qualcosa di simile dovrebbe funzionare:

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

E poi:

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

Potresti anche fare qualcosa del genere, invece:

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

E poi:

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

Oppure potresti usare il cycletag:

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


12

Esempio di righe e colonne di bootstrap. Nuova riga ogni 4 articoli. Chiude anche l'ultima riga anche se ci sono meno di 4 elementi.

frontend / templatetags / my_tags.py

from django import template

register = template.Library()

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

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

2
Questa è la risposta migliore perché descrive quale directory deve essere creata e descrive la necessità di caricare il modello personalizzato anche nel modello html. Grazie.
truthadjustr
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.