Question

I would like to change the class attribute of an li after each 4 elements (that means 5th, 9th, 13th li element classes should be changed).

I have tried something like below but it gave me an syntax error: Could not parse the remainder: '%4' from '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 %}

I will appreciate if somebody will suggest me a working solution.

Was it helpful?

Solution

You can't do evaluations like that in the django template. The ifequal tag expects only two parameters, and compares them. You would need some type of filter.

However, you could use the cycle tag instead:

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

EDIT: As pointed out, the original solution cleared the 4, 8th, etc, instead of from the 5th onwards. I have updated the answer to include the changes by Tolga.

OTHER TIPS

You can use forloop.counter0 and filter divisibleby:

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

The logic would be complex, but the divisibleby filter might help.

You don't want to do it like that - that's what cycle is for.

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

That example clears the 5th, 9th, 13th etc.

Edit: hat tip @cpharmston.

I struggled with this for a bit, trying to limit Bootstrap cards to 3 per card-deck.

This works in Django 2.1 and above, to limit a row to groups of 3:

{% ifequal forloop.counter|divisibleby:"3" True %}   
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top