2013-08-05 41 views
4

如何獲取傳遞給Jinja2模板的所有參數列表?如何獲取Jinja2模板中的參數列表

如果我有一個非常通用的模板,我想列出傳遞(用於調試的原因)的所有參數是有辦法做到這一點?

喜歡的東西:

mytemplate.html 

{% for argument in LIST_OF_ARGUMENT %} 
    {{ argument }}<br> 
{% endfor %} 

所以在視圖/foobar

如果我把這樣的模板:

return render_template('mytemplate.html', form=myform, foo='bar') 

我得到

the_content_of_form <br> 
bar <br> 

而如果我所說的模板是這樣的:

return render_template('mytemplate.html', lorem=ipsum, fooooo='barrrrr') 

我得到

the_content_of_lorem <br> 
barrrrr <br> 
+0

是的...我應該閱讀文檔。感謝您爲對話做出貢獻。 –

+0

@ZeroPiraeus這種解決方案似乎並不情況下工作,我傳遞給模板的對象與__call __()方法:我會繼續調查(讀取codegeek鏈接的文檔) –

回答

0

看看在jinja2.runtime.Context

「模板上下文保存模板的變量。它存儲傳遞給模板的值,也是名模板出口「

」模板背景支持只讀字典操作(Get,鍵,值,物品,出iterkeys,itervalues,iteritems,的GetItem包含)。此外,還有是不失敗,一個KeyError異常,但返回一個未定義的對象失蹤變量resolve()方法。」

1

那麼你只需要它們作爲參數傳遞給render_template,可能是最常見使用本包括使詞典列表作爲參數來渲染模板:

def Viewfunction(): 
    #do something, get something from db as result and then 
    arguments = [dict(name=row[0],age=row[1]) for row in result.fetchall()] 

    return render_template('mytemplate.html', form=myform, arguments=arguments) 

,然後像這樣訪問他們:

{% for item in arguments %} 
    {{ item.name }} 
    {{ item.age }} 
{% endfor %} 

很明顯,你也可以通過所有其他列表,而不僅僅是字典的名單模板,你循環以非常類似的方式在他們身上。

至於調試,我發現Flask內置調試工具非常有用,如果你得到一個異常,你只是得到一個頁面,你可以執行代碼,如果你對所有的變量感興趣,那麼你可以簡單地鍵入locals( )轉換爲堆棧跟蹤中的一個幀。你只需要啓用調試模式,利用它,只記得將其關閉生產。

下面是你工作的例子,它是從包含在瓶中flaskr示例應用程序,當你下載示例文件夾下采取:

@app.route('/') 
def show_entries(): 
    db = get_db() 
    cur = db.execute('select title, text from entries order by id desc') 
    entries = cur.fetchall() 
    return render_template('show_entries.html', entries=entries,local=locals()) 

當你這樣做:

{% for item in local %} 
{{ item }} 
{% endfor %} 

你會得到db cur條目,這是你想要的嗎?

+0

感謝您的回答,但我看到這個更像是一種解決方法,而不是真正的問題答案。 –

+0

你究竟需要什麼?這實際上是一個有趣的問題。我已經稍微編輯了我的答案。 –

+0

我需要的是一種通用的方式來訪問傳遞給模板的所有參數並對它們進行一些檢查。 的問題是,我想這樣做,在由在不同的視圖中使用的實際模板擴展了「佈局」模板,所以我沒有哪種變量(對象的情況下,簡單的字符串或其他方式)的任何線索已經通過了,也沒有可能的名字。我希望它給了你一個關於這個問題的想法。 –

相關問題