我想在 Django 通用显示 View 中显示对象列表 ListView
类(class)。而且,为了使它更漂亮,我尝试按字母顺序对其进行排序。所以,我使用内置的 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')
关于django - 如何按字母顺序对模板中的对象列表进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21511527/