2011-04-02 26 views
13

金字塔中的模板上下文的等價物是什麼?金字塔中的模板上下文的等價物(pylons user)

金字塔中的IBeforeRender事件是否與此有關?我已經閱讀了官方文檔,但難以理解IBeforeRender事件究竟是什麼。

+0

奇怪的問題...... IBeforeRender與模板上下文有什麼關係? – 2011-04-02 13:54:53

+0

對不起,我認爲它可能等同於金字塔中的模板連接,但我想這是另一回事。 – sidewinder 2011-04-02 14:03:55

+0

詢問Pylons郵件列表獲取Pylons人的幫助。 – 2011-04-02 14:05:04

回答

11

金字塔已經提供了其請求對象的tmpl_context,所以很簡單,你只需要訂閱一個BeforeRender事件將其添加到渲染全局:

def add_renderer_globals(event): 
    event['c'] = request.tmpl_context 
    event['tmpl_context'] = request.tmpl_context 

config.add_subscriber(add_renderer_globals, 'pyramid.events.BeforeRender') 

從現在在你的代碼,當您收到一個請求,你可以在上面設置參數:

request.tmpl_context.name = 'Bob' 

而且隨後你的模板可以參考name變量:

${ c.name } 
+0

這也很好。謝謝。 – sidewinder 2011-04-17 11:12:43

+0

'Request.tmpl_context'不再被記錄,它已經在'c'模板中可見 - 請參閱我的[答](http://stackoverflow.com/a/35443664/95735)。 – 2016-02-16 21:52:20

1

金字塔並沒有真正將「模板上下文」暴露給開發人員(雖然它在金字塔的各種模板引擎綁定內部使用)。

通常情況下,如果您想將某些東西填充到「c」中以用於模板內部,只需將其作爲關鍵字參數傳遞給render_to_response()調用或作爲使用預定義的渲染器返回的字典的一部分。

那麼做,因爲http://pylonsbook.com/en/1.1/using-view-templates.html#using-the-template-context-c-global類似的東西,你會怎麼做:

@view_config(renderer="greeting.mako") 
def index(request): 
    return {'name': 'Pyramid Developer'} 

而且greeting.mako:

<html> 
<head> 
    <title>Greetings</title> 
</head> 
<body> 
    <h1>Greetings</h1> 
    <p>Hello ${name}!</p> 
</body> 
</html> 
6

反之,如果你希望一些「全球袋」在那裏你可以的東西變量這將提供模板,那麼你的問題關於IBeforeRender是適當的。

from pyramid.events import subscriber 
from pyramid.events import BeforeRender 

@subscriber(BeforeRender) 
def add_global(event): 
    event['name'] = 'Pyramid Developer' 

還有一種在設置配置器時添加全局變量的替代方法。你可以看到完整的信息:http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/hooks.html#using-the-before-render-event

+0

請注意,他的「全球包」在主塔中爲g。這與每個請求上下文tmpl_context/c不同。 – 2011-04-12 14:38:22

+0

你的回覆非常有用。非常感謝。 – sidewinder 2011-04-15 22:44:55

-1

如果你正在尋找一個全局字典方便模板和視圖之間來回傳遞變量回到&,使用pyramid.request.TemplateContext

在模板頁面:

<%! 
    from pyramid.request import TemplateContext as c 
    c.foo = 123 
%> 

然後,您可以通過以相同方式在視圖中導入TemplateContext來訪問該變量:

from pyramid.request import TemplateContext as c 

這應該或多或少地等於在塔架中的tmpl_context。

2

在我看來,上面的解決方案並不完全複製Pylons模板上下文的行爲。如果在Pylons中呈現頁面請求並將a的值添加到上下文c,則可以在模板中將其作爲c.a進行訪問。但是,如果有人提出另一個請求,則該鍵/值將被丟棄。

上面的金字塔解決方案顯示了另一種行爲。鍵/值c.a將保留在模板上下文中。有時候,這是不希望的。有沒有任何建議來解決這個問題?

+0

是的,而不是使用**全局**事件'BeforeRender'將請求特定變量傳遞給渲染器,或直接渲染您的響應時使用它們。 *在金字塔中,您返回一個變量字典並讓渲染器將它們應用於模板。或者您可以自己在視圖代碼中渲染模板。* - 來自[Pylons magic globals](http://docs.pylonsproject.org/projects/pyramid-cookbook/en/latest/pylons/request.html#pylons-magic- globals)部分* Pyramid Cookbook *。 – 2016-02-16 22:29:56

0

金字塔食譜Pylons magic globals部分:

塔具有包含用於 當前請求的狀態數據的幾個魔術全局。這裏是最接近金字塔當量:

(...)

pylons.tmpl_context

劃痕對象請求本地數據,通常用來傳遞varables 到模板中。在金字塔中,您返回一個變量字典,並讓渲染器將它們應用於模板。或者您可以使用視圖代碼自行渲染模板 。

如果視圖是一個方法,您也可以設置實例變量。 實例在模板中可見爲view。有兩個主要使用場合 爲此。一,爲網站模板設置變量,否則 必須在每個返回字典中。二,對於HTML渲染專用的 變量,當視圖向 HTML呈現器和非HTML呈現器(例如JSON)註冊時。

金字塔確實有一個「tmpl_context」端口,位於request.tmpl_context, ,這在模板中可見爲c。但是,它從未在 Pyramid-Pylons用戶中遇到過,並且不再有記錄。