2012-06-30 12 views
7

¿qué tipo de condiciones podemos usar para la ramificación en jinja2? Quiero decir, ¿podemos usar declaraciones similares a las de Python? Por ejemplo, quiero verificar la longitud de la leyenda. Si tiene más de 60 caracteres, quiero limitarlo a 60 caracteres y poner "..." En este momento, estoy haciendo algo como esto, pero no funciona. error.log informa que la función len no está definida.if else ramming in jinja2

template = Template(''' 
    <!DOCTYPE html> 
      <head> 
        <title>search results</title> 
        <link rel="stylesheet" href="static/results.css"> 
      </head> 
      <body> 
        {% for item in items %} 
          {% if len(item[0]) < 60 %} 
            <p><a href="{{ item[1] }}">{{item[0]}}</a></p> 
          {% else %} 
            <p><a href="{{ item[1] }}">{{item[0][40:]}}...</a></p> 
          {% endif %} 
        {% endfor %} 
      </body> 
    </html>''') 

## somewhere later in the code... 

template.render(items=links).encode('utf-8') 

Respuesta

11

Estás muy cerca, solo tienes que moverlo a tu script de Python. Así se puede definir un predicado como esto:

def short_caption(someitem): 
    return len(someitem) < 60 

A continuación, registrarlo en el medio ambiente mediante la adición a la dict 'pruebas'):

your_environment.tests["short_caption"] = short_caption 

Y se puede utilizar de esta manera:

{% if item[0] is short_caption %} 
{# do something here #} 
{% endif %} 

para obtener más información, aquí está la documentación en Jinja custom tests

(es suficiente con hacer esto una vez, y yo creo que importe si lo haces antes o después de empezar las plantillas de representación, la documentación está claro)

Si no está utilizando un entorno sin embargo, se puede crear una instancia de esta manera:

import jinja2 

environment = jinja2.Environment() # you can define characteristics here, like telling it to load templates, etc 
environment.tests["short_caption"] = short_caption 

y luego cargar su plantilla a través de la get_string) método (:

template = environment.from_string("""your template text here""") 
template.render(items=links).encode('utf-8') 

por último, como nota al margen, si se utiliza el cargador de archivos, que le permite hacer la herencia de archivos, macros de importación, etc. Básicamente, Guarde su archivo como lo tiene ahora y dígale a jinja dónde está el directorio es.

+0

muchas gracias. Yo haré eso. También descubrí que también podría haberlo hecho comprobando la longitud mientras consulto los archivos db/index. – shashydhar

+0

contento de ayudar :) puede hacer clic en la pequeña casilla de verificación para aceptar la respuesta, para que la gente sepa que está resuelta y tal –

6

len no está definido en jinja2, puede usar;

{% if item[0]|length < 60 %} 
+0

Bueno, esta parece ser la forma más jinjaish (jinjonic?) De hacerlo. –

0

Jinja2 ahora tiene un filtro detruncado que hace esta comprobación para usted

truncate(s, length=255, killwords=False, end='...', leeway=None)

Ejemplo:

{{ "foo bar baz qux"|truncate(9) }} 
    -> "foo..." 

{{ "foo bar baz qux"|truncate(9, True) }} 
    -> "foo ba..." 

Referencia: http://jinja.pocoo.org/docs/2.9/templates/#truncate