2012-07-20 114 views
0

我想按字母顺序使用Jinja过滤器对选择列表中的选项进行排序。我遇到的问题是该列表具有混合大小写的值,并且它不是按字母顺序排列的。我仍然想继续使用忍者过滤器,想知道是否可以通过小写或其他方式进行比较。Jinja按字母顺序排列混合大小写的列表

在目前形式的列表

  • 所有源类型
  • Android Market的
  • Facebook的
  • 论坛
  • RSS订阅
  • Twitter的
  • 的YouTube
  • iTunes的

神社代码

{% 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)] 
+0

你不想写自己的过滤器?这很容易做到。你的函数可以使用内部排序,它使用一个键字符串转换成大写/小写字母,并比较 – 2012-07-20 19:39:21

+0

我的意思是我可以看到如果Jinja可以做到这一点 – BillPull 2012-07-20 19:42:09

回答

0

我从神社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) 

然后终于,你需要与神社的环境进行注册

environment.filters["ignore_case_sort"] = ignore_case_sort