2014-09-19 65 views
3

我建設使用Flaskjinja2 templating engine一個網站,我動態構建菜單(as described here):如何在Flask中動態添加項目到jinja變量?

{% 
    set navigation_bar = [ 
     ('/', 'index', 'Home'), 
     ('/aboutus/', 'aboutus', 'About Us'), 
     ('/faq/', 'faq', 'FAQ') 
    ] 
%} 

{% set active_page = active_page|default('index') -%} 

<ul> 
{% for href, id, title in navigation_bar %} 
    <li{% if id == active_page %} class="active"{% endif %}> 
     <a href="{{ href|e }}">{{ title|e }}</a> 
    </li> 
{% endfor %} 
</ul> 

現在,如果一個用戶登錄我想告訴一些額外的東西。所以在運行時我想將項目添加到navigation_bar變量。我想是這樣的:

{% if g.user.is_authenticated() %} 
    {% navigation_bar.append(('/someotherpage', 'someotherpage', 'SomeOtherPage')) -%} 
{% endif %} 

但不幸的是這將導致以下錯誤:TemplateSyntaxError: Encountered unknown tag 'navigation_bar'. Jinja was looking for the following tags: 'endblock'. The innermost block that needs to be closed is 'block'.

所以說:沒有任何人知道我可以在運行時將Jinja2的變量添加額外的項目?歡迎所有提示!

[紅利問題] 我也想知道,-{% set active_page = active_page|default('index') -%}的末尾做了什麼?

+0

你的代碼不工作的方式是什麼? – APerson 2014-09-19 16:06:42

+0

@APerson - 請原諒我將錯誤排除在外。我將它添加到問題中。這是一個TemplateSyntaxError:遇到未知標籤'navigation_bar'。 Jinja正在尋找以下標籤:'endblock'。需要關閉的最內層塊是「塊」。 – kramer65 2014-09-19 16:12:11

+0

'{%navigation_bar.append(('/ someotherpage','someotherpage','SomeOtherPage')) - %}'這裏navigation_bar是一個'list'而不是'block'.IMO – Nava 2014-09-20 04:43:28

回答

5

發生錯誤是因爲Jinja無法識別塊。每個Jinja塊應該從塊名稱開始。 dodo extension塊符合您的需求。要使用它,你應該添加 do擴展到jinja擴展。你可以這樣做:

app.jinja_env.add_extension('jinja2.ext.do') 

然後你可以使用做擴展。你的例子應該是這樣的:

{% if g.user.is_authenticated() %} 
    {% do navigation_bar.append(('/someotherpage', 'someotherpage', 'SomeOtherPage')) %} 
{% endif %} 

Here's另一個簡單的例子。

你會找到答案紅利問題here。簡而言之,-從塊的開始或結束中刪除空格(這取決於它所在的位置)。