如何按字母顺序对模板中的对象列表进行排序?

per*_*ror 6 django django-templates django-template-filters

我想在Django通用显示视图ListView类中显示对象列表.并且,为了使它更漂亮,我尝试按字母顺序对其进行排序.因此,我使用内置dictsort标记对列表进行排序.

以下是我使用的代码的摘要:

{% for item in object_list|dictsort:"name" %}
  ...
{% empty %}
  ...
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

问题是它根据字符的ASCII值对名称进行排序,这意味着bigcaps和smallcaps的排序方式不同.这是一个例子:

Bob
Eve
alice
zoe
Run Code Online (Sandbox Code Playgroud)

而且,我想要的是以下内容:

alice
Bob
Eve
zoe
Run Code Online (Sandbox Code Playgroud)

我在SO中查看了文档和几个问题,没有成功.所以,如果有人有办法实现这一目标,我将非常感激.

小智 6

这是一个非常古老的问题,但这个问题刚刚出现在我身上。只需添加.lower到 dictsort 即可,例如:

{% for item in object_list|dictsort:"name.lower" %}


Dan*_*man 5

您需要编写一个自定义过滤器,该过滤器以小写字母排序。很简单:

@register.filter
def sort_lower(lst, key_name):
    return sorted(lst, key=lambda item: getattr(item, key_name).lower())
Run Code Online (Sandbox Code Playgroud)

但是,如果您的列表是数据库中的一组对象,则您实际上不应该在Python中对它们进行排序-您应该使数据库以所需的顺序返回。

编辑

您如何使用过滤器?它应与dictsort完全相同:object_list|sort_lower:"name"。

要对数据库中的查询集进行排序,可以使用该extra方法添加该字段的小写版本:

MyModel.objects.all().extra(select={'lower_name': 'LOWER(NAME)'}, order_by='lower_name')
Run Code Online (Sandbox Code Playgroud)