Внедрить визуализированный контент из нескольких представлений в пирамиде в один базовый шаблон - PullRequest
2 голосов
/ 15 февраля 2012

Я бы хотел сделать что-то вроде ниже.

У меня настроены следующие маршруты:

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. Я играл с аргументом wrapper при определении своих представлений, но не мог понять, как это работает.

1 Ответ

3 голосов
/ 15 февраля 2012

Этого можно достичь несколькими способами (см., Например, Использование макросов ZPT в пирамиде или Введение в документацию по хамелеону ).

В вашем простом случае я думаю, что это самый быстрый способ: во-первых, измените файл 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 слот макроса Chameleon.

Ваш 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>
...