I have a list in my Django template. I want to do something only if the size of the list is greater than zero.
I have tried myList|length
and myList|length_is
but they have not been successful.
I've searched all over and don't see any examples. How can I check this?
See https://docs.djangoproject.com/en/stable/ref/templates/builtins/#if : just use, to reproduce their example:
{% if athlete_list %}
Number of athletes: {{ athlete_list|length }}
{% else %}
No athletes.
{% endif %}
If you're using a recent Django, changelist 9530 introduced an {% empty %} block, allowing you to write
{% for athlete in athlete_list %}
...
{% empty %}
No athletes
{% endfor %}
Useful when the something that you want to do involves special treatment for lists that might be empty.
A list is considered to be False
if it has no elements, so you can do something like this:
{% if mylist %}
<p>I have a list!</p>
{% else %}
<p>I don't have a list!</p>
{% endif %}
If you tried myList|length and myList|length_is and its not getting desired results, then you should use myList.count
myList
is a list
then this calls list.count()
which raises an error that's masked in the template and gets treated as a false value. The count
method is to count the number of instances that match the passed in value. However, this works if myList
is a queryset.
You can try with:
{% if theList.object_list.count > 0 %}
blah, blah...
{% else %}
blah, blah....
{% endif %}
This works:
{% if myList|length %}
Do something!
{% endif %}
Why there's so many answers here and why there's so much confusion is that this didn't always work. I think at one point template filters couldn't be used on arguments to the if
statement and this was later added. It's also now possible to do things such as {% if myList|length >= 3 %}
. The filter should do the equivalent of len(myList)
so any type of object that can handle that would also be able to handle the |length
filter.
Collection.count no bracket
{% if request.user.is_authenticated %}
{{wishlists.count}}
{% else %}0{% endif %}
I need the collection length to decide whether I should render table <thead></thead>
but don't know why @Django 2.1.7 the chosen answer will fail(empty) my forloop
afterward.
I got to use {% if forloop.first %} {% endif %}
to overcome:
<table>
{% for record in service_list %}
{% if forloop.first %}
<thead>
<tr>
<th>日期</th>
</tr>
</thead>
{% endif %}
<tbody>
<tr>
<td>{{ record.date }}</td>
</tr>
{% endfor %}
</tbody>
</table>
Success story sharing
length
filter also seems to work in conditional blocks. e.g.{% if athlete_list|length > 1 %}...{% endif %}