Mako模板内联if语句

17 投票
2 回答
9938 浏览
提问于 2025-04-15 22:45

我有一个模板变量,叫做 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 个回答

4

更通用的解决方案

如果你需要一个更通用的解决方案,比如说你想在类标签里放一个叫做 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 及以上版本。


警告(针对旧版本)

注意 {}${} 里的用法!

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)}
34

Python中的普通内联if语句是可以正常工作的:

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

撰写回答