2012-03-24 14 views
20

Quiero lanzar un int que se pasa a la plantilla a través de la url, pero dice que la función str no está definida.lanzando ints a str en Jinja2

¿Cómo puedo evitar esto?

Aquí está mi código:

{% extends "base.html" %} 

{% block content %} 

    {% for post in posts %} 
    {% set year = post.date.year %} 
    {% set month = post.date.month %} 
    {% set day = post.date.day %} 
    {% set p = str(year) + '/' + str(month) + '/' + str(day) + '/' + post.slug %} 
    <h3> 
     <a href="{{ url_for('get_post', ID=p) }}"> 
      {{ post.title }} 
     </a> 
    </h3> 

     <p>{{ post.content }}</p> 
    {% else: %} 
      There's nothing here, move along. 
    {% endfor %} 

{% endblock %} 

Respuesta

25

Jinja2 también define el operador ~, que convierte automáticamente los argumentos de cadena en primer lugar, como una alternativa al operador +.

Ejemplo:

{% set p = year ~ '/' ~ month ~ '/' ~ day ~ '/' ~ post.slug %} 

Ver Other operators o, si realmente desea utilizar str, modificar el diccionario Environment.globals.

+1

Esto me dejó sin palabras. Jinja2 se vuelve más y más increíble a medida que trabajo con él. – vectorfrog

4

Es posible utilizar join:

{% set p = (year, month, day, post.slug)|join("/") %} 
11

Para convertir una cadena en una expresión, usa x|string() en lugar de str(x).

string() es un ejemplo de filtro, y hay varios filtros útiles que vale la pena conocer.