Вкратце это делается так:
#Создается функция-подписчик в модуле subscribers.py
from pyramid.renderers import get_renderer
def add_base_template(event):
base = get_renderer('templates/base.pt').implementation()
event.update({'base': base})
#Регистрируем подписчик в функции main модуля __init__.py
config.add_subscriber('shootout.subscribers.add_base_template',
'pyramid.events.BeforeRender')
#Сам базовый шаблон base.pt должен иметь слоты определенные с помощью следующей конструкции
<tal:block metal:define-slot="content"></tal:block>
#Дочерний шаблон определяется так
<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="base">
<tal:block metal:fill-slot="content">
Содержимое дочерней страницы
</tal:block></html>
P.S. Если кто посоветует выкинуть Chameleon и взять другой шаблонизатор, буду рад вас услышать.