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

标签 django django-templates django-template-filters

我想在 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/

相关文章:

python - 当模型位于不同应用程序中时,ManytoMany 字段 django 模板

python - Django 中的提及/内部链接

python - View 或模板中的查询集

python - 用于按类别生成产品的模板过滤器

python - Django - 来自模板标签内变量的字符串

python - F() 表达式与 Django 的奇怪行为

python - 序列化器的 to_representation 能否在 DRF 3 中生成多个输出项?

django - 如何从 django admin 中的内联类实例访问 modeladmin 类实例

python - 如何在 Django 中使用 Ajax 从 views.py 渲染 templatetag 上下文?

jquery - 如何操作 ajax 请求的元素集