Mako模板内联if语句

时间:2010-05-15 21:41:17

标签: python templates mako

我有一个模板变量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 个答案:

答案 0 :(得分:33)

Python的正常内联如果有效:

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

答案 1 :(得分:1)

简易解决方案

你可以这样做:

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

警告

请注意{}内的${}

Jochen提到的使用三元运算符的解决方案也是正确的,但在与str.format()结合时可能会导致意外行为。

你需要在Mako的{}内避免${},因为显然Mako在找到第一个}后停止解析表达式。这意味着您不应该使用例如:

  • ${'{}'.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 +