Найти - Пользователи
Полная версия: Pyramid - Базовый шаблон для Chameleon
Начало » Pyramid / Pylons / TurboGears » Pyramid - Базовый шаблон для Chameleon
1
Solaris
Задача сделать базовый шаблон с пустыми слотами на основе которого формируются остальные страницы сайта. Рабочий пример того, как это можно сделать, есть в 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>
В данном варианте базовый шаблон рендерится вне зависимости от того, будет он использоваться или нет. И если на сайте используется с десяток базовых шаблонов, всех их придется рендерить. Для меня это не критично, но все же возникают вопросы. Может я что-то недопонял, но почему такая распространенная задача, как наследование шаблона, не реализована авторами шаблонного движка? Может есть какие-то другие варианты для решения данной задачи?

P.S. Если кто посоветует выкинуть Chameleon и взять другой шаблонизатор, буду рад вас услышать.
ziro
Ту надо немного разобраться со структурой пирамиды.

1. в pyramid.events.BeforeRender стоит пихать только те вещи, которые реально используются на практически всех страницах. Более того, на самом деле они тупо добавляются к контексту при разборе шаблона и тот же самый эффект Вы можете достичь передавая данные непосредственно из view, типа такого:

@view_config(...)
def index(request):
base = get_renderer('templates/base.pt').implementation()
return {'base': base}
так что, если у Вас используются несколько базовых шаблонов, то возможно наиболее правильно их передавать именно из view.

2. По поводу наследования немного не понял - вы же сами привели код с явным наследованием шаблона.

3. По поводу “выкинуть Chameleon” - выкидывайте, если он Вас не устраивает - есть и другие варианты. Тут в общем то на вкус и цвет. Например, если Вам по душе подход джанги - используйте https://pylonsproject.org/projects/pyramid_jinja2/dev/
Solaris
1. Спасибо большое, это то, чего мне не хватало. Аж обидно, что сам не догадался. )

2. Имелось ввиду, что внутри одного шаблона нельзя указать базовый шаблон. Наверное есть какие-то политические соображения, чтобы шаблонизатор работал с одним файлом и не имел доступа к другим файлам. Но мне вполне достаточно Вашего варианта.

3. Ну насчет выкинуть я наверное погорячился) Пока мне нравится изящность Chameleon, но бывают некоторые казусы. И так как мне опыта не всегда хватает, чтобы принять правильное стратегическое решение, то и возникают подобные провокационные предположения. Т.е. когда не можешь решить задачу каким-либо инструментом, тут два варианта: либо руки не из того места, либо инструмент неподходящий. И тут помогает совет профи: либо “кто ж таким инструментом такие задачи решает”, либо “кто ж таким инструментом так бездарно работает” )

Еще раз спасибо!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB