2012-02-15 7 views
2

Я хотел бы сделать что-то вроде ниже.Inject визуализированный контент из нескольких видов в 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 {...} 

Существует базовый шаблон 'шаблоны/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. Когда я определял свои представления, я играл с аргументом обертки, но не мог понять, как это работает.

ответ

3

Вы можете достичь этого несколькими способами (см., Например, 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> 

Это определяет 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> 
+0

Это выглядит более или менее exacly, что я хочу. Я думаю, что разные методы представления должны были бы получить базовый-dict из некоторого распространенного метода и добавить к нему дополнительные данные перед возвратом? (Поскольку все шаблоны, использующие base.pt, должны иметь одинаковые базовые данные, которые base.pt будет отображать, в этом примере только user_id, но для моего реального base.pt у меня больше данных, которые являются общими) – ralphtheninja

+0

@MagnusSkog да, точно. – DzinX

+0

Всегда приятно иметь возможность получать деньги от сообщества :) Спасибо! – ralphtheninja