2012-06-30 25 views
7

chúng ta có thể sử dụng loại điều kiện nào cho phân nhánh trong jinja2? Tôi có nghĩa là chúng ta có thể sử dụng python như báo cáo. Ví dụ, tôi muốn kiểm tra độ dài của chú thích. Nếu lớn hơn 60 ký tự, tôi muốn giới hạn nó thành 60 ký tự và đặt "..." Ngay bây giờ, tôi đang làm một cái gì đó như thế này nhưng nó không hoạt động. error.log báo cáo rằng hàm len không xác định.nếu có phân nhánh khác trong jinja2

template = Template(''' 
    <!DOCTYPE html> 
      <head> 
        <title>search results</title> 
        <link rel="stylesheet" href="static/results.css"> 
      </head> 
      <body> 
        {% for item in items %} 
          {% if len(item[0]) < 60 %} 
            <p><a href="{{ item[1] }}">{{item[0]}}</a></p> 
          {% else %} 
            <p><a href="{{ item[1] }}">{{item[0][40:]}}...</a></p> 
          {% endif %} 
        {% endfor %} 
      </body> 
    </html>''') 

## somewhere later in the code... 

template.render(items=links).encode('utf-8') 

Trả lời

11

Bạn đang khá gần, bạn chỉ cần chuyển nó sang tập lệnh Python thay thế. Vì vậy, bạn có thể xác định một vị như thế này:

def short_caption(someitem): 
    return len(someitem) < 60 

Sau đó đăng ký nó đối với môi trường bằng cách thêm nó vào dict 'kiểm tra'):

your_environment.tests["short_caption"] = short_caption 

Và bạn có thể sử dụng nó như thế này:

{% if item[0] is short_caption %} 
{# do something here #} 
{% endif %} 

Mọi chi tiết, đây là tài liệu jinja trên custom tests

(bạn chỉ phải làm điều này một lần, và tôi nghĩ rằng nó quan trọng cho dù bạn làm điều đó trước hoặc sau khi bạn bắt đầu các mẫu vẽ, các tài liệu không rõ ràng)

Nếu bạn không sử dụng một môi trường nào, bạn có thể nhanh chóng nó như thế này:

import jinja2 

environment = jinja2.Environment() # you can define characteristics here, like telling it to load templates, etc 
environment.tests["short_caption"] = short_caption 

Và sau đó tải mẫu của bạn thông qua các get_string() phương pháp:

template = environment.from_string("""your template text here""") 
template.render(items=links).encode('utf-8') 

Cuối cùng, như một mặt lưu ý, nếu bạn sử dụng bộ nạp tập tin, nó cho phép bạn làm thừa kế tập tin, macro nhập khẩu, vv về cơ bản, bạn 'd chỉ cần lưu tập tin của bạn như bạn có nó ngay bây giờ và nói với jinja nơi thư mục Là.

+0

thanks a lot. Tôi sẽ làm việc đó. Tôi cũng phát hiện ra rằng tôi cũng có thể thực hiện nó bằng cách kiểm tra độ dài trong khi truy vấn tạo thành các tệp db/index. – shashydhar

+0

vui lòng trợ giúp :) bạn có thể nhấp vào hộp kiểm nhỏ để chấp nhận câu trả lời, vì vậy mọi người sẽ biết nó được giải quyết và như vậy –

6

len không được xác định trong jinja2, bạn có thể sử dụng;

{% if item[0]|length < 60 %} 
+0

Đẹp - điều này có vẻ là cách jinjaish (jinjonic?) Nhất để làm điều đó. –

0

Jinja2 bây giờ có một truncate lọc mà không kiểm tra này cho bạn

truncate(s, length=255, killwords=False, end='...', leeway=None)

Ví dụ:

{{ "foo bar baz qux"|truncate(9) }} 
    -> "foo..." 

{{ "foo bar baz qux"|truncate(9, True) }} 
    -> "foo ba..." 

tham khảo: http://jinja.pocoo.org/docs/2.9/templates/#truncate

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