2012-05-08 19 views
17

Muszę sprawdzić, czy zmienna texts jest zdefiniowana czy nie w index.html.Sprawdź, czy tablica jest pusta w Jinja2

Jeśli zmienna jest zdefiniowana i nie jest pusta, powinienem renderować pętlę. W przeciwnym razie chcę wyświetlić komunikat o błędzie {{error}}.

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

Jak mogę to powiedzieć w jinja2?

+0

Musisz wyjaśnić siebie jaśniej. To nie jest pyton; to jest szablonowy język jinga2. –

Odpowiedz

15

Spójrz na dokumentacji Jinja2 defined(): http://jinja.pocoo.org/docs/templates/#defined

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

Czy to wystarczająco jasne? W twoim przypadku może to wyglądać tak:

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

Spowoduje to pominięcie przypadku krawędzi określonej tablicy, która jest pusta, co również powinno być błędem, zgodnie z pierwotnym pytaniem. – Andrew

24

celu zbadania obecności? "(Zdefiniowanej-ness"), użyj is defined.

Aby sprawdzić, czy aktualna lista nie jest pusta, użyj samej listy jako warunku.

Chociaż nie ma to zastosowania do twojego przykładu, ta forma sprawdzania pustki jest przydatna , jeśli potrzebujesz czegoś innego niż pętla.

Sztuczny Przykładem może być

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

'Niezdefiniowane' jest również fałszywe, więc nie musisz go testować osobno, chociaż jest to przydatne, jeśli nie testujesz tylko prawdziwości listy. – davidism

2

Jest możliwe, że texts można zdefiniować, ale zawierają jedną listę element, który jest pusty ciąg znaków; Na przykład:

texts = [''] 

W tym przypadku, badania czy texts jest zdefiniowana będzie produkować prawdziwy wynik więc należy przetestować pierwszy element Zamiast:

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

Można też chcesz połączyć to z |length filtr, aby upewnić się, że ma tylko jeden element.

14

myślę najlepiej jest kombinacją defined() sprawdza wraz z patrząc na length of the array poprzez length() function:

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

'teksty | length> 0' jest równoważne' tekstom' - pusta lista w teście boolowskim jest równa "false". –

4

Jak wspomniano w the documentation, można również napisać:

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

Obsługuje zarówno przypadek, w którym texts jest niezdefiniowany, jak i przypadek, w którym texts jest pusty.

Powiązane problemy