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



我正在尝试使用Jinja过滤器按字母顺序对选择列表中的选项进行排序。我遇到的问题是这个列表大小写混合,并且没有按字母顺序排列。我仍然想继续使用jinja过滤器,想知道是否无论如何都可以通过小写或其他方式进行比较。

当前形式的列表

  • 所有源类型
  • 安卓市场
  • Facebook
  • 论坛
  • RSS源
  • Twitter
  • 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)] 

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

(case_sensitive=False)

所以你得到了:

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

参见:

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

我浏览了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

最新更新