Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 1, 2011 12:45:20

Solaris
От:
Зарегистрирован: 2011-06-02
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Pyramid - Базовый шаблон для Chameleon

Задача сделать базовый шаблон с пустыми слотами на основе которого формируются остальные страницы сайта. Рабочий пример того, как это можно сделать, есть в 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 и взять другой шаблонизатор, буду рад вас услышать.



Офлайн

#2 Сен. 5, 2011 13:19:35

ziro
От:
Зарегистрирован: 2009-08-13
Сообщения: 225
Репутация: +  8  -
Профиль   Отправить e-mail  

Pyramid - Базовый шаблон для Chameleon

Ту надо немного разобраться со структурой пирамиды.

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/



Офлайн

#3 Сен. 5, 2011 19:22:34

Solaris
От:
Зарегистрирован: 2011-06-02
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Pyramid - Базовый шаблон для Chameleon

1. Спасибо большое, это то, чего мне не хватало. Аж обидно, что сам не догадался. )

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

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

Еще раз спасибо!



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version