2012-05-08 66 views
17

Tôi cần kiểm tra xem biến số texts được xác định hay không trong index.html.Kiểm tra xem một mảng có trống không trong Jinja2

Nếu biến được xác định và không trống thì tôi sẽ hiển thị vòng lặp. Nếu không, tôi muốn hiển thị thông báo lỗi {{error}}.

Về cơ bản này trong 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 %} 

Làm thế nào để tôi nói điều này trong jinja2?

+0

Bạn cần giải thích rõ ràng hơn. Đây không phải là python; đây là ngôn ngữ khuôn mẫu jinga2. –

Trả lời

15

Hãy nhìn vào tài liệu của Jinja2 defined(): http://jinja.pocoo.org/docs/templates/#defined

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

Có đủ rõ ràng? Trong trường hợp của bạn, trường hợp này có thể trông giống như sau:

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

Điều này bỏ lỡ trường hợp cạnh của một mảng được xác định là trống, mà cũng nên là một lỗi, theo câu hỏi ban đầu. – Andrew

24

Để kiểm tra sự hiện diện ("được xác định-Ness"?), Hãy sử dụng is defined.

Để kiểm tra danh sách hiện tại không trống, hãy sử dụng chính danh sách đó làm điều kiện.

Mặc dù dường như không áp dụng cho ví dụ của bạn, hình thức kiểm tra tính trống này hữu ích nếu bạn cần một thứ khác ngoài vòng lặp.

Một ví dụ nhân tạo có thể là

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

'Không xác định' cũng sai, vì vậy bạn không cần phải thử nghiệm riêng biệt, mặc dù nó hữu ích nếu bạn không chỉ kiểm tra tính trung thực của danh sách. – davidism

2

Có thể là texts có thể được định nghĩa nhưng chứa một yếu tố danh sách duy nhất mà là một chuỗi rỗng; Ví dụ:

texts = [''] 

Trong trường hợp này, kiểm tra nếu texts được xác định sẽ tạo ra một kết quả đúng, do đó bạn nên kiểm tra các yếu tố đầu tiên thay vì:

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

Bạn cũng có thể muốn kết hợp điều đó với các |length lọc để đảm bảo nó chỉ có một phần tử.

14

Tôi nghĩ rằng đặt cược tốt nhất của bạn là một sự kết hợp của định nghĩa() kiểm tra cùng với nhìn vào length of the array qua length() function:

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

'văn bản | độ dài> 0' tương đương với' văn bản' - một danh sách trống trong phép thử boolean đánh giá thành 'false'. –

4

Như đã đề cập trong the documentation, bạn cũng có thể viết:

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

Nó xử lý cả hai trường hợp trong đó texts không xác định và trường hợp texts trống.

Các vấn đề liên quan