2012-06-13 5 views
10

Я использую новейшую пирамиду для создания веб-приложения. Как-то мы начали использовать Chameleon в качестве механизма шаблонов. Я использовал Mako раньше, и было очень просто создать базовый шаблон. Возможно ли это с хамелеоном?Как использовать наследование шаблона с помощью Chameleon?

Я попытался просмотреть документы, но я не могу найти легкое решение.

ответ

15

С Chameleon> = 2.7.0 вы можете использовать выражение «load» TALES. Пример:

main.pt:

<html> 
<head> 
    <div metal:define-slot="head"></div> 
</head> 
<body> 
    <ul id="menu"> 
     <li><a href="">Item 1</a></li> 
     <li><a href="">Item 2</a></li> 
     <li><a href="">Item 3</a></li> 
    </ul> 
    <div metal:define-slot="content"></div> 
</body> 
</html> 

my_view.pt:

<html metal:use-macro="load: main.pt"> 

<div metal:fill-slot="content"> 
    <p>Bonjour tout le monde.</p> 
</div> 

</html> 
2

Другой вариант, который использовался ранее Chameleon, получил возможность загружать шаблоны из файловой системы, это передать шаблон «base» в качестве параметра.

Чтобы упростить вещи, я часто обернуть такие вещи в «теме» объект:

class Theme(object): 

    def __init__(self, context, request): 
     self.context = context 
     self.request = request 

    layout_fn = 'templates/layout.pt' 

    @property 
    def layout(self): 
     macro_template = get_template(self.layout_fn) 
     return macro_template 

    @property 
    def logged_in_user_id(self): 
     """ 
     Returns the ID of the current user 
     """ 
     return authenticated_userid(self.request) 

, который затем может быть использован, как это:

def someview(context, request): 
    theme = Theme(context, request) 
    ... 
    return { "theme": theme } 

, которые затем могут быть использованы в шаблоне :

<html 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:tal="http://xml.zope.org/namespaces/tal" 
    xmlns:metal="http://xml.zope.org/namespaces/metal" 
    metal:use-macro="theme.layout.macros['master']"> 
<body> 
    <metal:header fill-slot="header"> 
     ... 
    </metal:header> 
    <metal:main fill-slot="main"> 
     ... 
    </metal:main> 
</body> 
</html> 
+0

Спасибо большое. Я попробую решение сегодня на работе –

+0

Chameleon действительно поддерживает загрузку шаблонов из файловой системы напрямую; см. ответ, предоставленный пользователем1456346 –

0

Сделать шаблон здесь:

<proj>/<proj>/templates/base.pt 

с содержимым:

<html> 
    <body> 
    <div metal:define-slot="content"></div> 
    </body> 
</html> 

Используйте шаблон здесь:

<proj>/<proj>/templates/about_us.pt 

вставив содержимое:

<div metal:use-macro="load: base.pt"> 
    <div metal:fill-slot="content"> 
     <p>Hello World.</p> 
    </div> 
</div>