Форум сайта python.su
Задача сделать базовый шаблон с пустыми слотами на основе которого формируются остальные страницы сайта. Рабочий пример того, как это можно сделать, есть в Shootout (https://github.com/Pylons/shootout)
Вкратце это делается так:
#Создается функция-подписчик в модуле 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>
Офлайн
Ту надо немного разобраться со структурой пирамиды.
1. в pyramid.events.BeforeRender стоит пихать только те вещи, которые реально используются на практически всех страницах. Более того, на самом деле они тупо добавляются к контексту при разборе шаблона и тот же самый эффект Вы можете достичь передавая данные непосредственно из view, типа такого:
@view_config(...)
def index(request):
base = get_renderer('templates/base.pt').implementation()
return {'base': base}
Офлайн
1. Спасибо большое, это то, чего мне не хватало. Аж обидно, что сам не догадался. )
2. Имелось ввиду, что внутри одного шаблона нельзя указать базовый шаблон. Наверное есть какие-то политические соображения, чтобы шаблонизатор работал с одним файлом и не имел доступа к другим файлам. Но мне вполне достаточно Вашего варианта.
3. Ну насчет выкинуть я наверное погорячился) Пока мне нравится изящность Chameleon, но бывают некоторые казусы. И так как мне опыта не всегда хватает, чтобы принять правильное стратегическое решение, то и возникают подобные провокационные предположения. Т.е. когда не можешь решить задачу каким-либо инструментом, тут два варианта: либо руки не из того места, либо инструмент неподходящий. И тут помогает совет профи: либо “кто ж таким инструментом такие задачи решает”, либо “кто ж таким инструментом так бездарно работает” )
Еще раз спасибо!
Офлайн