Jinja按字母顺序排列混合大小写的列表

时间:2012-07-20 19:35:15

标签: python jinja2

我正在尝试使用Jinja过滤器按字母顺序对选择列表中的选项进行排序。我遇到的问题是列表具有混合的大小写值,并且不是按字母顺序排列的。我仍然想继续使用jinja过滤器,想知道是否反正用小写或其他东西进行比较。

目前表格中的清单

  • 所有来源类型
  • Android电子市场
  • 论坛
  • RSS Feed
  • 微博
  • 的YouTube
  • 的iTunes

Jinja Code

{% for source,number in sources.items()|sort %}
        <option {% if number == user.postfiltertype %} selected {% endif %} value='{{ number }}'>{{ source }}</option>
{% endfor %}

输入

[('iTunes', 8), ('RSS Feeds', 2), ('Twitter Incoming', 9), ('Facebook', 4), ('Android Market', 10), ('All Source Types', 0), ('YouTube', 5), ('Twitter', 3), ('Forums', 1)] 

2 个答案:

答案 0 :(得分:3)

您可以在|sort之后添加以下内容:

(case_sensitive=False)

所以你得到:

{% for source,number in sources.items()|sort(case_sensitive=False) %}

请参阅:

http://jinja.pocoo.org/docs/templates/#filters

答案 1 :(得分:0)

我查看了Jinja API并没有看到任何相关内容。也就是说,做起来会相对简单。如果您只想将第一个项目转换为小写,则可以执行以下操作:

def ignore_first_case(x):
    if len(x) >= 1 and not isinstance(x, str):
        return (hasattr(x[0], "lower") and x[0].lower() or x[0]) + x[1:]
    else:
        return hasattr(x, "lower") and x.lower() or x

def ignore_case_sort(seq):
    return seq.sort(key=ignore_first_case)

然后最后,你需要在jinja环境中注册它

environment.filters["ignore_case_sort"] = ignore_case_sort