2009-09-17 10 views
1

Je voudrais changer l'attribut de classe d'un LI après chaque 4 éléments (cela signifie que les 5ème, 9ème, 13ème classes d'éléments li devraient être changées).comment utiliser le reste math dans le modèle django?

J'ai essayé quelque chose comme ci-dessous, mais il m'a donné une erreur de syntaxe: Impossible d'analyser le reste: « % 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 %} 

Je vais apprécier si quelqu'un va suggère moi une solution de travail.

Répondre

5

Vous ne pouvez pas effectuer d'évaluations de ce type dans le modèle django. La balise ifequal attend seulement deux paramètres et les compare. Vous auriez besoin d'un type de filtre.

Cependant, vous pouvez utiliser la balise de cycle à la place:

{% for p in plist %} 
    {% if forloop.first %} 
     <li> {{p.title}} </li> 
    {% else %} 
     <li{% cycle '' '' '' ' class="clear"' %}> {{p.title}} </li> 
    {% endif %} 
{% endfor %} 

EDIT: Comme l'a souligné, la solution originale effacée 4, 8, etc., au lieu de partir du 5. J'ai mis à jour la réponse pour inclure les changements par Tolga.

+0

Cela efface les 4ème, 8ème, 12ème ... plutôt que 5ème, 9ème, 13ème. –

+0

J'ai changé votre solution suggérée qui a fonctionné comme je devais. {% pour p dans plist%} {% \t si forloop.first%} \t \t

  • {{p.title}} {
  • \t% else%} \t \t
  • {{p.title}} {
  • \t% endif%} {% endfor%} Cela effacera le 9 5Le et ainsi de suite .. Merci pour vous tous pour vos précieuses réponses et commentaires. – Tolga

    +0

    Merci Tolga, j'ai mis à jour la réponse avec la modification. –

    2

    La logique serait complexe, mais le filtre divisibleby pourrait aider.

    +0

    Avec que l'affaire serait faisable, mais comme vous dites la complexité serait telle qu'il est probablement préférable de le déplacer hors de la vue. Ajout d'un attribut simple est beaucoup plus lisible et devrait donner beaucoup moins de maux de tête. – Agos

    +0

    J'ai essayé divisibleby, malheureusement, il ne donne pas le résultat dont j'ai besoin. Avec le divisibleby; Je peux changer l'attribut pour le 4ème, 8ème, pas le 5ème, le 9ème .. – Tolga

    +0

    Ainsi, vous pouvez utiliser le filtre 'add':' {% ifequal forloop.counter | add: "- 1" | divisibleby: 4%} "Horrible, mais fait ce que vous voulez. –

    1

    Vous ne voulez pas le faire comme ça - c'est ce que cycle est pour.

    {% for p in plist %} 
         <li{% ifnotequal forloop.counter 1 %}{% cycle ' class="clear"' '' '' '' %}{% endifnotequal %}>{{p.title}</li> 
    {% endfor %} 
    

    Cet exemple efface le 5, 9, 13, etc.

    Edit: pointe chapeau @cpharmston.

    +0

    Qu'en est-il de {% ifnotequal forloop.counter 1%} {% cycle '' '' '' 'class = "clear"'%} {% endifnotequal%}? –

    +0

    Édité en, merci. –

    +0

    Je viens de voir votre solution éditée. Je suis sûr que cela donnera aussi le même résultat requis. – Tolga

    7

    Vous pouvez utiliser forloop.counter0 et filtre divisiblePar:

    {% ifequal forloop.counter0|divisibleby:"4" %} 
    
    Questions connexes