Como usar a matemática restante em django modelo?
-
08-07-2019 - |
Pergunta
Gostaria de mudar o atributo de classe de um li depois de cada 4 elementos (o que significa 5, 9, 13 classes de elemento li deve ser mudado).
Eu tentei algo como abaixo, mas ele me deu um erro de sintaxe: Não foi possível analisar o restante: '% 4' de 'forloop.counter% 4'
{% for p in plist %}
{% ifequal forloop.counter%4 1 %}
<li class="clear"> {{p.title}} </li>
{% else %}
<li> {{p.title}} </li>
{% endifequal %}
{% endfor %}
Eu aprecio se alguém vai me sugerir uma solução de trabalho.
Solução
Você não pode fazer as avaliações como a do modelo de Django. A tag ifequal espera apenas dois parâmetros, e compara-los. Você iria precisar de algum tipo de filtro.
No entanto, você pode usar a tag ciclo em vez disso:
{% for p in plist %}
{% if forloop.first %}
<li> {{p.title}} </li>
{% else %}
<li{% cycle '' '' '' ' class="clear"' %}> {{p.title}} </li>
{% endif %}
{% endfor %}
EDIT: Como foi salientado, a solução original cancelou a 4, 8, etc, em vez da partir do 5º em diante. Eu atualizei a resposta para incluir as mudanças por Tolga.
Outras dicas
Você pode usar forloop.counter0 e filtro divisibleby:
{% ifequal forloop.counter0|divisibleby:"4" %}
A lógica seria complexa, mas a divisibleby poder filtro de ajuda.
Você não quer fazê-lo assim - é o que cycle
é para.
{% for p in plist %}
<li{% ifnotequal forloop.counter 1 %}{% cycle ' class="clear"' '' '' '' %}{% endifnotequal %}>{{p.title}</li>
{% endfor %}
Esse exemplo limpa a 5ª, 9ª, 13ª etc.
Edit:. Chapéu de ponta @cpharmston
Eu lutei com isso por um pouco, tentando limitar Bootstrap cartas para 3 por cartão-deck.
Isso funciona em Django 2.1 e acima, para limitar uma linha para grupos de 3:
{% ifequal forloop.counter|divisibleby:"3" True %}