2012-07-20 118 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