Глобальные переменные шаблона Chameleon

Я использую Pyramid 1.3 и их шаблоны, написанные на Chameleon. Поскольку для разных страниц или шаблонов может потребоваться глобальное изменение таблицы стилей для каждой страницы, я хотел бы иметь возможность переопределять классы тега body на странице (конечно, я бы предпочел делать это из шаблонов).

<body class="${global_variable_or_something_else}"></body>

Что я пробовал:

  • Используя tal:define="global body_class" из вложенных макросов. Не работает.
  • Я пытался использовать <metal:div metal:define-slot="vars">...variable definition...</metal:div> и <metal:div metal:fill-slot="vars">...redefinition...</metal:div> и переопределять переменные в подмакросах. Это работает, но что, если у меня есть несколько определений переменных в родительском шаблоне и мне нужно переопределить только одно?

Есть ли хороший способ сделать это лучше с METAL?


person Andrey Cizov    schedule 25.10.2012    source источник


Ответы (1)


Глобальные переменные в шаблонах страниц, как и глобальные переменные в Python, могут быть переопределены. Поэтому вместо этого вы делаете следующее:

<rootelement metal:define-macro="macroname"
             tal:define="global var1 value1; global var2 value2">
    <metal:overrides define-slot="overrides"></metal:overrides>
    <!-- some template code using var1 and var2 -->
</rootelement>

Затем используйте metal:fill-slot для предоставления переопределений; вы можете переопределить столько переменных, сколько хотите:

<rootelement metal:use-macro="macroname">
    <metal:overrides fill-slot="overrides"><tal:defines define="global var1 differentvalue" /></metal:overrides>
</rootelement>
person Martijn Pieters    schedule 25.10.2012
comment
Какую версию Chameleon вы использовали для тестирования этого решения? - person Andrey Cizov; 26.10.2012
comment
@AndreyCizov: нет; Здесь я делаю предположения, основанные на (большом) опыте работы с TAL (шаблоны страниц Zope). Возможно, реализация Chameleon оптимизировала этот путь кода. - person Martijn Pieters; 26.10.2012