How to test for a List in Jinja2?

后端 未结 4 1176
生来不讨喜
生来不讨喜 2021-01-03 18:33

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/extensio

相关标签:
4条回答
  • 2021-01-03 19:07

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

    {% if var is iterable %}
    
    0 讨论(0)
  • 2021-01-03 19:11

    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,
    })
    
    0 讨论(0)
  • 2021-01-03 19:13

    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 讨论(0)
  • 2021-01-03 19:27

    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.

    0 讨论(0)
提交回复
热议问题