Внедрить визуализированный контент из нескольких представлений в Pyramid в один базовый шаблон
Я хотел бы сделать что-то вроде ниже.
У меня настроены следующие маршруты:
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>
Теперь, по моему мнению, я хотел бы добавить следующее содержимое в div с идентификатором "content":
<!-- 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. Я играл с аргументом обертки при определении моих взглядов, но не мог понять, как это работает.
1 ответ
Это можно сделать несколькими способами (см., Например, " Использование макросов ZPT в Pyramid" или " Введение в документацию по 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_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>