我想在Django通用显示视图ListView
类中显示对象列表.并且,为了使它更漂亮,我尝试按字母顺序对其进行排序.因此,我使用内置dictsort
标记对列表进行排序.
以下是我使用的代码的摘要:
{% for item in object_list|dictsort:"name" %} ... {% empty %} ... {% endfor %}
问题是它根据字符的ASCII值对名称进行排序,这意味着bigcaps和smallcaps的排序方式不同.这是一个例子:
Bob Eve alice zoe
而且,我想要的是以下内容:
alice Bob Eve zoe
我在SO中查看了文档和几个问题,没有成功.所以,如果有人有办法实现这一目标,我将非常感激.
您需要编写一个自定义过滤器,该过滤器以小写字母排序。很简单:
@register.filter def sort_lower(lst, key_name): return sorted(lst, key=lambda item: getattr(item, key_name).lower())
但是,如果您的列表是数据库中的一组对象,则您实际上不应该在Python中对它们进行排序-您应该使数据库以所需的顺序返回。
编辑
您如何使用过滤器?它应与dictsort完全相同:object_list|sort_lower:"name"
。
要对数据库中的查询集进行排序,可以使用该extra
方法添加该字段的小写版本:
MyModel.objects.all().extra(select={'lower_name': 'LOWER(NAME)'}, order_by='lower_name')