2012-06-13 54 views
10

我正在使用最新的金字塔來構建一個Web應用程序。不知何故,我們已經開始使用Chameleon作爲模板引擎。我之前使用過Mako,創建基本模板非常簡單。這也可能與變色龍一起嗎?如何在變色龍中使用模板繼承?

我試圖查看文檔,但我似乎無法找到一個簡單的解決方案。

回答

15

隨着變色龍> = 2.7.0,您可以使用「加載」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使用的另一種方法是從文件系統中加載模板,是通過「基本」模板作爲參數。

爲了簡化問題,我經常包這樣的東西變成了「主題」對象:

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確實支持直接從文件系統加載模板;請參閱user1456346提供的答案 –

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>