2012-06-13 11 views
10

Używam najnowszej Piramidy do budowy aplikacji internetowej. Jakoś zaczęliśmy używać Chameleon jako silnika szablonów. Używałem Mako wcześniej i bardzo łatwo było stworzyć szablon podstawowy. Czy to możliwe również z kameleonem?Jak używać dziedziczenia szablonów w Chameleon?

Próbowałem przeglądać dokumenty, ale nie mogę znaleźć łatwego rozwiązania.

Odpowiedz

15

Za pomocą Chameleon> = 2.7.0 można użyć wyrażenia TALES "load". Przykład:

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

Inną opcją, której użyto przed Chameleonem, udało się wczytać szablony z systemu plików, jest przekazanie "podstawowego" szablonu jako parametru.

Aby uprościć, często zawijać takie rzeczy do „tematu” obiektu:

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) 

które następnie mogą być używane tak:

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

które następnie mogą być wykorzystane w szablonie :

<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

dzięki. Wypróbuję rozwiązanie dzisiaj w pracy –

+0

Chameleon obsługuje bezpośrednio szablony ładowania z systemu plików; zobacz odpowiedź udzieloną przez użytkownika1456346 –

0

Zrób szablon tutaj:

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

o treści:

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

Użyj szablonu tutaj:

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

wstawiając zawartość:

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