2012-06-13 12 views
10

Estoy utilizando la última Pyramid para crear una aplicación web. De alguna manera, hemos comenzado a usar Chameleon como el motor de plantillas. He usado Mako antes y fue extremadamente simple crear una plantilla base. ¿Es esto posible con el camaleón también?¿Cómo se usa la herencia de plantilla con Chameleon?

He intentado revisar los documentos pero parece que no puedo encontrar una solución fácil.

Respuesta

15

Con camaleón> = 2.7.0 se puede utilizar la expresión Tales "carga". Ejemplo:

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

Otra opción, que se utilizó antes de que Chameleon tuviera la capacidad de cargar plantillas desde el sistema de archivos, es pasar la plantilla "base" como parámetro.

Para simplificar las cosas, a menudo me envuelvo tales cosas en un "tema" objeto:

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) 

que luego puede ser utilizada como esto:

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

que luego se pueden utilizar en la plantilla :

<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

muchas gracias. Voy a intentar la solución hoy en el trabajo –

+0

Chameleon admite la carga de plantillas directamente desde el sistema de archivos; ver la respuesta proporcionada por el usuario1456346 –

0

hacer una plantilla aquí:

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

con contenidos:

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

Use la plantilla aquí:

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

mediante la inserción de los contenidos:

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