我想做下面的事情。
我配置了以下路由:
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_view和foo_view,以便它们可以将自己的模板(home.pt,foo.pt)注入base.pt?我还需要以某种方式将$ {user_id}之类的数据也传输到base.pt中。定义视图时,我一直在使用wrapper参数,但无法弄清楚它是如何工作的。
最佳答案
您可以通过多种方式实现此目标(例如,参见Using ZPT Macros in Pyramid或Chameleon documentation introduction)。
在您的简单情况下,我认为这是最快的方法:首先,将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>
这定义了Chameleon宏的
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_id
设置为USER
,则/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>
关于python - 将 Pyramid 中多个 View 中的渲染内容注入(inject)到一个基本模板中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9290150/