Мако шаблоны встроенные, если заявление - PullRequest
17 голосов
/ 16 мая 2010

У меня есть переменная шаблона 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 ]

33 голосов
/ 16 мая 2010

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

<a href="#" ${'class="friend"' if c.is_friend else ''}>link</a>
1 голос
/ 07 декабря 2017

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

Вы можете сделать это так:

<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 +

...