Как условно добавить класс к элементу блока внутри цикла повторения с помощью Chameleon

Я только начинаю работать с шаблонами пирамид и хамелеонов.

У меня есть следующий пример кода, который отображает меню сайта.

<li tal:repeat="menu view.site_menu">
    <tal:block tal:condition="menu.current">
        <span>${menu.title}</span>
    </tal:block>
    <tal:block tal:condition="not menu.current">
        <span><a href="/${menu.href}">${menu.title}</a></span>
    </tal:block>
</li>

Он выделяет элемент меню текущей страницы, не делая его ссылкой. Я пытаюсь использовать навигацию по пилюлям начальной загрузки. Мне нужно условно добавить class="active" к тегу <li> активной страницы.

Я попытался добавить tal:condition к тегу <li>:

 <li tal:repeat="menu view.site_menu" tal:condition="menu.current" class="active">
    <a href="/${menu.href}">${menu.title}</a>
 </li>

но я получаю следующую ошибку:

builtins.NameError
NameError: menu

 - Expression: "menu.current"
 - Filename:   H:\eta\eta\eta\templates\global_layout.pt
 - Location:   (line 38: col 57)
 - Source:     ... .site_menu" tal:condition="menu.current" class="active">
                                              ^^^^^^^^^^^^

Я думаю, что menu доступен только внутри тегов tal:repeat.

Каков наилучший способ выполнить то, что мне нужно.


person cstrutton    schedule 24.11.2013    source источник


Ответы (1)


Условие выполняется перед повтором; обычно вы вкладываете операторы, чтобы поместить условие в тег, содержащийся в повторении. Однако, чтобы поместить условный атрибут, вместо этого используйте tal:attributes:

<li tal:repeat="menu view.site_menu" tal:attributes="class 'active' if menu.current else None">
    <a href="/${menu.href}">${menu.title}</a>
</li>

Установка атрибута на None удаляет его из тега.

person Martijn Pieters    schedule 24.11.2013
comment
Работает отлично. У меня есть один вопрос. Я так понимаю в доках этот атрибут заменит. Есть ли способ добавить класс (оставив существующие классы нетронутыми)? Примечание: сегодня это не проблема, но я могу увидеть, где я могу столкнуться с этим в будущем. Я думаю о какой-то конструкции, похожей на class = class + 'someclass' - person cstrutton; 24.11.2013
comment
Обычно я просто перечисляю классы в tal:attributes; вы не можете ссылаться на исходное значение в теге из tal:attributes. Вы можете установить значение default, но это сигнальное значение, вы не можете использовать его, например, в конкатенации строк. - person Martijn Pieters; 24.11.2013
comment
Чтобы сохранить классы по умолчанию, вы можете использовать простое расширение ${..}: class=ваши классы по умолчанию${' active' if menu.current else ''} - person Wichert Akkerman; 20.08.2014