2012-08-14 33 views
12

Por lo que puedo ver, no hay forma de comprobar si un objeto es una instancia de lista en Jinja2. En primer lugar, ¿es correcto y, en segundo lugar, alguien ha implementado una prueba/extensión personalizada en Jinja2? Cualquier ayuda sería genial.Prueba de una lista en Jinja2

Respuesta

9

Puede hacer esto fácilmente con un filtro personalizado en jinja2.

En primer lugar se crea el método de ensayo:

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

y añadirlo como un filtro personalizado:

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

Jinja tiene muchas pruebas incorporadas. Probablemente estés buscando iterable.

{% if var is iterable %} 
+5

Una cadena también es iterable, por lo que no funcionará – pors

+0

También noté la prueba de 'secuencia', pero también considera que una cadena es una secuencia. –

18

lo hice como esto {% if var is iterable and var is not string %}

+1

en mi caso '{% if var is string%}' funcionó perfectamente; gracias. – berto

-1

En mi configuración, me gustaría que un valor a ser una cadena o lista de cadenas que entran en la plantilla de Jinja. Entonces, realmente, lo que me importaba no era la cadena frente a la lista, sino el elemento individual frente a los elementos múltiples. Esta respuesta podría ayudar si su caso de uso es similar.

Dado que no hay una prueba integrada para "is list?" que también rechaza cadenas, tomé prestado un patrón del diseño de la API y envolví los objetos individuales en una lista en el lado de Python, luego verifiqué la longitud de la lista en el lado de Jinja.

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 %} 

Y si todo lo que quiere hacer es agregar un separador de elementos para fines de visualización, se puede omitir la comprobación de longitud explícita y justo {{ value|join(', ') }}.

+0

Parece que esta respuesta recibió un voto negativo por alguna razón. Funciona bien para mí, pero siéntase libre de agregar un comentario si algo no funciona para usted. –

Cuestiones relacionadas