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>
muchas gracias. Voy a intentar la solución hoy en el trabajo –
Chameleon admite la carga de plantillas directamente desde el sistema de archivos; ver la respuesta proporcionada por el usuario1456346 –