2012-06-30 38 views
7

我們可以在jinja2中使用什麼樣的條件進行分支?我的意思是我們可以使用python like語句。例如,我想檢查標題的長度。如果大於60個字符,我想將其限制爲60個字符,並放上「...」現在,我正在做這樣的事情,但它不起作用。 error.log報告len函數未定義。if else在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') 

回答

11

你非常接近,你只需要將它移動到你的Python腳本。所以,你可以定義這樣的斷言:

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

然後將其添加到「測試」字典)註冊它的環境:

your_environment.tests["short_caption"] = short_caption 

而且你可以使用它像這樣:

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

欲瞭解更多信息,這裏的一對custom tests

的神社文檔(你只需要做到這一點一次,我認爲它很重要,你以前是否做到這一點,或者你開始渲染模板後,該文檔都不清楚)

如果你不使用的環境是,你可以實例化這樣的:

import jinja2 

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

然後通過get_string加載模板()方法:

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

最後,作爲一個側面說明,如果你使用的文件加載器,它可以讓你做的文件繼承,進口宏等,基本上你'現在只要保存你的文件,並告訴jinja目錄是。

+0

非常感謝。我會去做。我還發現,我也可以通過在查詢db/index文件本身時查看長度來完成它。 – shashydhar

+0

很高興幫助:)你可以點擊小複選框來接受答案,這樣人們就會知道它已經解決了,好像 –

6

len未在jinja2中定義,可以使用;

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

不錯 - 這似乎是最好的jinjaish(jinjonic?)方法。 –

0

的Jinja2現在有一個截斷過濾器,做這個檢查你

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

例子:

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

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

參考:http://jinja.pocoo.org/docs/2.9/templates/#truncate