2012-08-14 33 views
12

Theo như tôi thấy, không có cách nào để kiểm tra xem một đối tượng có phải là một thể hiện danh sách trong Jinja2 hay không. Thứ nhất, đó là chính xác và thứ hai, có ai thực hiện một thử nghiệm tùy chỉnh/mở rộng trong Jinja2? Bất kỳ sự trợ giúp nào đều sẽ là tuyệt vời.Kiểm tra danh sách trong Jinja2

Trả lời

9

Bạn có thể dễ dàng thực hiện việc này làm trắng bộ lọc tùy chỉnh trong jinja2.

Đầu tiên tạo bạn phương pháp thử nghiệm:

def is_list(value): 
    return isinstance(value, list) 

Và thêm nó như một bộ lọc tùy chỉnh:

j = jinja2.Jinja2(app) 
j.environment.filters.update({ 
     'is_list': is_list, 
}) 
0

Jinja có nhiều thử nghiệm được xây dựng trong. Có thể bạn đang tìm kiếm iterable.

{% if var is iterable %} 
+5

Một chuỗi cũng có thể lặp lại, do đó sẽ không hoạt động – pors

+0

Tôi cũng nhận thấy thử nghiệm 'chuỗi' nhưng cũng xem xét chuỗi một chuỗi. –

18

tôi đã làm nó như thế này {% if var is iterable and var is not string %}

+1

trong trường hợp của tôi '{% if var là string%}' hoạt động hoàn hảo; cảm ơn bạn. – berto

-1

Trong thiết lập của tôi, tôi muốn cho một giá trị cho một trong hai là một chuỗi hoặc danh sách các chuỗi đi vào mẫu Jinja. Vì vậy, thực sự những gì tôi quan tâm không phải là chuỗi vs danh sách, nhưng mục duy nhất so với nhiều mục. Câu trả lời này có thể hữu ích nếu trường hợp sử dụng của bạn tương tự.

Vì không có thử nghiệm tích hợp cho "danh sách?" cũng từ chối các chuỗi, tôi đã mượn một mẫu từ thiết kế API và gói các đối tượng đơn lẻ vào một danh sách ở phía Python rồi kiểm tra độ dài danh sách đã chọn ở phía Jinja.

Python:

context = { ... } 

# ex. value = 'a', or ['a', 'b'] 
if not isinstance(value, list): 
    value = [value] 

context['foo'] = value 

Jinja:

{% if foo|length == 1 %} 
    single-item list 
{% elif foo|length > 1 %} 
    multi-item list 
{% endif %} 

Và nếu tất cả các bạn muốn làm là thêm một dấu phân cách hàng cho mục đích hiển thị, bạn có thể bỏ qua việc kiểm tra chiều dài rõ ràng và chỉ {{ value|join(', ') }}.

+0

Có vẻ như câu trả lời này đã nhận được phiếu giảm giá vì một lý do nào đó. Nó hoạt động tốt cho tôi, nhưng cảm thấy tự do để thêm một bình luận nếu một cái gì đó không làm việc cho bạn. –

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