2011-04-02 57 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用户中遇到过,并且不再有记录。