How to test for a List in Jinja2?

As far as I can see, there is no way to test if an object is a List instance in Jinja2.

Is that correct and has anyone implemented a custom test/extension in Jinja2?

5 Answers

I did it like this:

{% if var is iterable and (var is not string and var is not mapping) %} 

You can find a list of all jinja tests here.

3

You can easily do this whit a custom filter in jinja2.

First create you test method:

def is_list(value): return isinstance(value, list) 

And add it as an custom filter:

j = jinja2.Jinja2(app) j.environment.filters.update({ 'is_list': is_list, }) 

Iterable return True also on dict. Try this:

{% if var.__class__.__name__ == 'list' %} 

In my setup, I'd like for a value to either be a string or list of strings coming into the Jinja template. So really what I cared about wasn't string vs list, but single item vs multiple items. This answer might help if your use case is similar.

Since there isn't a built-in test for "is list?" that also rejects strings, I borrowed a pattern from API design and wrapped the single objects in a list on the Python side then checked list length on the Jinja side.

Python:

context = { ... } # ex. value = 'a', or ['a', 'b'] if not isinstance(value, list): value = [value] context['foo'] = value 

Jinja:

{% if foo|length == 1 %} single-item list {% elif foo|length > 1 %} multi-item list {% endif %} 

And if all you want to do is add an item separator for display purposes, you can skip the explicit length check and just {{ value|join(', ') }}.

0

Jinja has many builtin tests. You are probably looking for iterable.

{% if var is iterable %} 
2

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like