2013-11-24 3 views
4

Я только начинаю с шаблонов пирамиды и хамелеона.Как условно добавить класс в элемент блока внутри цикла повтора с 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> 

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

Я попытался добавить Таля: условие к <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.

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

ответ

6

Состояние выполнено до повтор; вы обычно добавляете выражения, чтобы поставить условие на тег, содержащийся в повторе. Однако, чтобы поставить условный атрибут, используйте 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 удаляет его из тега.

+0

Работает отлично. У меня есть один вопрос. Поскольку я понимаю доки, это заменит атрибут. Есть ли способ добавить класс (оставив существующие классы неповрежденными)? Примечание: сегодня это не проблема, но я могу увидеть, где я могу столкнуться с этим в будущем. Я думаю о какой-то конструкции, похожей на 'class = class + 'someclass'' – cstrutton

+0

Обычно я просто перечисляю классы в' tal: attributes'; вы не можете ссылаться на исходное значение в теге из 'tal: attributes'. Вы * можете * задавать вещи по умолчанию, но это контрольное значение, вы не можете использовать его в конкатенации строк, например. –

+0

Понял ... еще раз спасибо. – cstrutton