如何使用jinja2复制模板中的名称?

时间:2012-07-30 02:01:23

标签: python templates jinja2 pluralize

如果我有一个名为num_countries的模板变量,要使用Django复数,我可以写下这样的内容:

countr{{ num_countries|pluralize:"y,ies" }}

有没有办法用jinja2做这样的事情? (我知道这在jinja2中不起作用)jinja2的替代方案是什么?

感谢任何提示!

4 个答案:

答案 0 :(得分:26)

Guy Adini的回复绝对是可行的方式,不过我认为(或者我可能误用它)它与Django中的 pluralize 过滤器并不完全相同。

因此这是我的实现(使用装饰器注册)

@app.template_filter('pluralize')
def pluralize(number, singular = '', plural = 's'):
    if number == 1:
        return singular
    else:
        return plural

这样,它的使用方式完全相同(好吧,参数以稍微不同的方式传递):

countr{{ num_countries|pluralize:("y","ies") }}

答案 1 :(得分:13)

目前的Jinja版本有i18n extension,它增加了不错的翻译和复数标记:

{% trans count=list|length %}
There is {{ count }} {{ name }} object.
{% pluralize %}
There are {{ count }} {{ name }} objects.
{% endtrans %}

即使您实际上没有多种语言版本,也可以使用此功能 - 如果您添加其他语言,您将拥有一个不需要更改的合适基础(并非所有语言都通过添加&而复数化) #39; s'有些甚至有多种复数形式。)

答案 2 :(得分:4)

根据Jinja的文档,没有built in filter可以满足您的需求。您可以轻松设计custom filter来执行此操作,但是:

def my_plural(str, end_ptr = None, rep_ptr = ""):
    if end_ptr and str.endswith(end_ptr):
        return str[:-1*len(end_ptr)]+rep_ptr
    else:
        return str+'s'

然后在您的环境中注册:

environment.filters['myplural'] = my_plural

您现在可以将my_plural用作Jinja模板。

答案 3 :(得分:-6)

您还想检查单词是否已复数。这是我的解决方案:

def pluralize(text):
    if text[-1:] !='s':
        return text+'s'
    else: 
        return text

然后将标记注册到您的环境中(这也可以应用于Django模板引擎)。