2012-05-08 28 views
17

Necesito comprobar si la variable texts está definida o no en index.html.Comprueba si una matriz está vacía en Jinja2

Si la variable está definida y no está vacía, entonces debería representar el ciclo. De lo contrario, quiero mostrar el mensaje de error {{error}}.

Básicamente esto en PHP

if (isset($texts) && !empty($texts)) { 
    for() { ... } 
} 
else { 
    print $error; 
} 

index.html

{% for text in texts %} 
    <div>{{error}}</div> 
    <div class="post"> 
     <div class="post-title">{{text.subject}}</div> 
     <pre class="post-content">{{text.content}}</pre> 
    </div> 
{% endfor %} 

¿Cómo puedo decir esto en Jinja2?

+0

Tienes que explicarte más claro. Esto no es Python; este es el lenguaje de plantillas jinga2. –

Respuesta

15

Tome un vistazo a la documentación de Jinja2 defined(): http://jinja.pocoo.org/docs/templates/#defined

{% if variable is defined %} 
    value of variable: {{ variable }} 
{% else %} 
    variable is not defined 
{% endif %} 

¿Es lo suficientemente claro? En su caso podría tener este aspecto:

{% if texts is defined %} 
    {% for text in texts %} 
     <div>{{ error }}</div> 
     <div class="post"> 
      <div class="post-title">{{ text.subject }}</div> 
      <pre class="post-content">{{ text.content }}</pre> 
     </div> 
    {% endfor %} 
{% else %} 
    Error! 
{% endif %} 
+17

Esto omite el caso límite de una matriz definida que está vacía, lo que también debería ser un error, de acuerdo con la pregunta original. – Andrew

24

Para probar la presencia (? "-Dad definida"), utilice is defined.

Para probar que una lista presente no está vacía, use la lista como la condición.

Si bien no parece aplicarse a su ejemplo, esta forma de verificación de vacío es útil si necesita algo más que un bucle.

Un ejemplo podría ser artificial

{% if (texts is defined) and texts %} 
    The first text is {{ texts[0] }} 
{% else %} 
    Error! 
{% endif %} 
+0

'Undefined' también es falso, por lo que no es necesario que lo pruebe por separado, aunque es útil si no solo está probando la veracidad de la lista. – davidism

2

Es posible que texts se podría definir, pero contienen un solo elemento de la lista, que es una cadena vacía; Por ejemplo:

texts = [''] 

En este caso, la prueba si texts se define producirá un resultado verdadero por lo que debe probar el primer elemento en su lugar:

{% if texts[0] != '' %} 
    ..code here.. 
{% endif %} 

Usted también puede combinar eso con el |length filtrar para asegurarse de que solo tiene un elemento.

14

creo que la mejor opción es una combinación de defined() cheque junto con el examen de la length of the array través length() function:

{% if texts is defined and texts|length > 0 %} 
    ... 
{% endif %} 
+1

'texts | length> 0' es equivalente a' texts' - una lista vacía en una prueba booleana se evalúa como 'false'. –

4

Como se mencionó en the documentation, también se puede escribir:

{% for text in texts %} 
    <div class="post"> 
     <div class="post-title">{{text.subject}}</div> 
     <pre class="post-content">{{text.content}}</pre> 
    </div> 
{% else %} 
    <div>{{ error }}</div> 
{% endfor %} 

Maneja el caso donde texts no está definido, y el caso donde texts está vacío.

Cuestiones relacionadas