我正在尝试使用Jinja过滤器按字母顺序对选择列表中的选项进行排序。我遇到的问题是这个列表大小写混合,并且没有按字母顺序排列。我仍然想继续使用jinja过滤器,想知道是否无论如何都可以通过小写或其他方式进行比较。
当前形式的列表
- 所有源类型
- 安卓市场
- 论坛
- RSS源
- 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