2

我想做类似下面的事情。

我配置了以下路线:

config.add_route('home', '/')
config.add_route('foo', '/foo')

以下观点:

@view_config(route_name='home', renderer='templates/home.pt')
def home_view(request):
    return {...}

@view_config(route_name='foo', renderer='templates/foo.pt')
def foo_view(request):
    return {...}

有一个基本模板'templates/base.pt':

<!DOCTYPE html>
<html>
<head></head>
<body>
    Welcome ${user_id}<br>
    <a href="/foo">Foo</a><br>
    <div id="content">
        <!-- Inject rendered content here from either / or /foo --> 
    </div>
</body>
</html>

现在在我看来,我想将以下内容注入 id 为“content”的 div:

<!-- templates/home.pt -->
<div id="home-content">Home content</div>

<!-- templates/foo.pt -->
<div id="foo-content">Foo content</div>

我将如何更改上面的home_viewfoo_view以便他们可以将自己的模板(home.pt、foo.pt)注入 base.pt?不知何故,我还需要将诸如${user_id}之类的数据传输到 base.pt 中。在定义我的视图时,我正在玩wrapper参数,但无法弄清楚它是如何工作的。

4

1 回答 1

3

您可以通过多种方式实现这一点(例如,请参阅在 Pyramid 中使用 ZPT 宏Chameleon 文档介绍)。

在您的简单情况下,我认为这是最快的方法:首先,将base.pt文件更改为:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:tal="http://xml.zope.org/namespaces/tal"
      xmlns:metal="http://xml.zope.org/namespaces/metal">
<head></head>
<body>
    Welcome ${user_id}<br>
    <a href="/foo">Foo</a><br>
    <div id="content">
        <tal:block metal:define-slot="content">
        </tal:block>
    </div>
</body>
</html>

这定义了content变色龙宏的插槽。

foo.pt可能看起来像这样:

<metal:main
    xmlns:tal="http://xml.zope.org/namespaces/tal"
    xmlns:metal="http://xml.zope.org/namespaces/metal"
    use-macro="load: base.pt">
    <tal:block metal:fill-slot="content">
        <div id="foo-content">Foo content</div>
    </tal:block>
</metal:main>

注意use-macro="load: base.pt线。home.pt应该遵循相同的模式。user_id和其他模板变量可用于宏,因此,例如,如果您设置user_idUSER/foo将呈现:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head></head>
<body>
    Welcome USER<br>
    <a href="/foo">Foo</a><br>
    <div id="content">
        <div id="foo-content">Foo content</div>
    </div>
</body>
</html>
于 2012-02-15T11:33:53.720 回答