Mako шаблоны встроенный оператор if

у меня есть переменная шаблона, c.is_friend, который я хотел бы использовать, чтобы определить, применяется ли класс. Например:

if c.is_friend is True
<a href="#" class="friend">link</a>

if c.is_friend is False
<a href="#">link</a>

есть ли способ сделать это встроенным, например:

<a href="#" ${if c.is_friend is True}class="friend"{/if}>link</a>

или что-то в этом роде?

2 ответов


обычный встроенный Python, если работает:

<a href="#" ${'class="friend"' if c.is_friend else ''}>link</a>

Простое Решение

вы могли бы сделать это вот так:

<a href="#" 
% if c.is_friend is True:
class="friend"
% endif
>link</a>

предупреждение

обратите внимание {} внутри ${}!

решение с тернарным оператором, упомянутым Йохеном, также правильно, но может привести к неожиданному поведению при объединении с str.format().

вам нужно избегать {} внутри Мако ${}, потому что, по-видимому, Мако перестает анализировать выражение после нахождения первого }. Это означает, что вы не должны использовать например:

  • ${'{}'.format(a_str)}. Вместо этого используйте ${'%s' % a_str}.
  • ${'%(first)s %(second)s' % {'first': a_str1, 'second': a_str2}}. Вместо этого используйте
    ${'%(first)s %(second)s' % dict(first=a_str1, second=a_str2)}

Общее Решение

так, например, если вам нужно придумать более общее решение, скажем, вам нужно поставить переменную под названием relationship внутри тега класса вместо статической строки вы можете сделать это так со старой строкой форматирование:

<a href="#" ${'class="%s"' % relationship if c.has_relation is True else ''}>link</a>

или без форматирования строки:

<a href="#" 
% if c.has_relation is True:
class="${relationship}"
% endif
>link</a>

это должно работать для Python 2.7+ и 3+