jinja2
list length
template inheritance
python templating
web development

Get lengths of a list in a jinja2 template

Data Structures & Algorithms practice on Codemia

Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.

Practice algorithms

Introduction

In Jinja2, the usual way to get the size of a list is the length filter. It works for lists, tuples, strings, dictionaries, and many other iterable values, and it is often enough for conditional rendering and simple display logic in templates.

Use the length filter

The most direct pattern is:

jinja2
{{ users|length }}

If users is ["Ana", "Ben", "Cara"], the output is:

text
3

This is the template equivalent of asking for the length of the collection.

Typical conditional rendering

List length is often used to show or hide sections of a page.

jinja2
1{% if users|length > 0 %}
2  <p>There are {{ users|length }} users.</p>
3{% else %}
4  <p>No users found.</p>
5{% endif %}

That keeps simple presentation decisions inside the template without requiring extra boolean flags from the view code.

Use it with loops and empty states

Jinja2 already supports for and else, which is often a cleaner companion to length.

jinja2
1<ul>
2{% for user in users %}
3  <li>{{ user }}</li>
4{% else %}
5  <li>No users available.</li>
6{% endfor %}
7</ul>

If you only need an empty-state message, for plus else is often nicer than checking length manually. Use length when the count itself matters in the rendered output.

Examples with nested data

The filter works on nested collections too.

jinja2
<p>{{ post.comments|length }} comments</p>

or:

jinja2
{% if category.products|length >= 10 %}
  <p>Large category</p>
{% endif %}

This is common in dashboards, tables, and summary cards.

Dictionaries and strings also work

length is not limited to lists.

jinja2
{{ settings|length }}
{{ title|length }}

If settings is a dictionary, the result is the number of keys. If title is a string, the result is the character count.

That flexibility is useful, but it also means you should know what object type is actually being passed into the template.

Keep heavy logic out of the template

Jinja2 can compute lengths, but that does not mean every count belongs in the template. For expensive or business-critical logic, it is better to compute the value in Python and pass the result in the render context.

For example, if getting the count requires a database query, do not trigger that inside templating logic. Compute it in the view:

python
return render_template("users.html", users=users, user_count=len(users))

Then the template becomes:

jinja2
<p>{{ user_count }} users</p>

The template stays simple, and the application logic stays where it belongs.

|length versus truthiness

Often you do not need the exact size at all. In Jinja2, an empty list is already falsey, so this is valid:

jinja2
{% if users %}
  <p>Users exist.</p>
{% endif %}

That is cleaner than users|length > 0 when the count itself is irrelevant.

Use length only when the number matters, not just the presence of elements.

Common Pitfalls

The biggest mistake is pushing too much application logic into the template just because length is available. Counting a plain in-memory list is fine; business decisions and expensive queries should stay in Python code.

Another issue is using users|length > 0 when {% if users %} would be clearer. Templates read better when they express intent directly.

Developers also forget what kind of object they passed into the template. length works on many types, but the meaning changes depending on whether the value is a list, string, or dictionary.

Finally, if the value can be None, decide on the behavior before rendering. Calling length on None is not the same as working with an empty list.

Summary

  • Use {{ my_list|length }} to get the size of a list in Jinja2.
  • The same filter works for many other iterable values too.
  • Use length when the count matters in the rendered output.
  • Prefer truthiness checks or for ... else when you only need empty-state behavior.
  • Keep expensive counting and business logic in Python rather than in the template.

Related reading
Course
Intermediate
27 lessons
15 hours
DSA Fundamentals

Master algorithmic patterns and data structures through hands-on LeetCode-style problems - from arrays and hashing to dynamic programming and advanced graphs.

View the course
Track what you have practised

A free account saves your progress, solutions and study plan across every problem on Codemia.

Data Structures & Algorithms practice on Codemia

Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.

Practice algorithms

All Rights Reserved.