jinja2中的loop.length

时间:2013-02-13 12:01:11

标签: python jinja2

我正在尝试格式化博客的标签显示。我可以列出tag1,tag2,tag3等......就好了。我甚至想出了如何消除最后一个逗号:

{% if not forloop.last %}, {% endif %}

我的问题是......我如何处理“和”?

例如:tag1,tag2和tag3。

这是规则

如果两个标签=并且没有逗号分隔。 如果3个或更多标签=倒数第二个获得“和” 从来没有逗号或列表的末尾。

我希望我能用这样的东西在jinja2中创建那些显示规则......

{% if loop.index == forloop.last - 1 %}and {% endif %}

当然,此代码会导致

  

引发TemplateSyntaxError,“'如果'语句格式不正确”   TemplateSyntaxError:'if'语句格式不正确

我感觉有人会在应用程序中告诉我这样做;不是模板..但请解释原因......我应该使用自定义过滤器吗?

1 个答案:

答案 0 :(得分:1)

建议remove as much logic as possible from templates,以便您可以专注于演示并避免在页面渲染中添加失败点,但总是存在边缘情况。

如果您定义类似于内置join的自定义过滤器,则会保留更清晰的模板。这是一个接受纯文本标记名列表并返回字符串的示例:

def join_tags(tags):
    if not tags:
        return '(no tags)'
    elif len(tags) == 1:
        return tags[0]
    else:
        return ', '.join(tags[:-1]) + ' and ' + tags[-1]

app.jinja_env.filters['join_tags'] = join_tags

模板用法:

{{ tags|join_tags }}

如果您还在过滤器中添加了标记,则必须将safe过滤器应用于结果,以便不会对其进行转义。