Как отсортировать список объектов в шаблоне в алфавитном порядке?

Вопрос:Я хочу отобразить список объектов в представлении общего класса Django ListView. И, чтобы сделать его красивее, я стараюсь сортировать его в алфавитном порядке. Итак, я использую встроенный тег dictsort для сортировки списка. Вот сводка кода, который я использовал: {% for item in object_list|dictsort:"name" %} ... {% empty %} ... {% endfor %} Проблема заключается в

Вопрос:

Я хочу отобразить список объектов в представлении общего класса 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 – вы должны получить базу данных, чтобы вернуть их в том порядке, в котором вы хотите.

Edit

Как вы используете фильтр? Он должен быть точно таким же, как и в файле dictsort: object_list|sort_lower:»name».

Чтобы отсортировать запрос в базе данных, вы можете использовать метод extra, чтобы добавить нижестоящую версию поля:

MyModel.objects.all().extra(select={‘lower_name’: ‘LOWER(NAME)’}, order_by=’lower_name’) Ответ №1

Фактически, я посмотрел исходный код dictsort в …/lib/python2.7/site-packagesdjango/template/defaultfilters.py. И я просто добавил настроенный метод cmp:

@register.filter def sort_lower(value, arg): try: return sorted(value, key=Variable(arg).resolve, cmp=lambda x,y: cmp(x.lower(), y.lower())) except (TypeError, VariableDoesNotExist): return »

Этот способ позволяет сортировать по подполам (например, field1.field2), которые были необходимы в моем случае.

Ответ №2

Я знаю, что это старый вопрос, но самый простой способ сортировки списка без учета регистра:

name_of_list.sort (ключ = str.lower)

См ссылку для справки: https://www.afternerd.com/blog/python-sort-list/

Вы можете проверить это, используя этот код:

my_list = [«alice», «Bob», «eve», «Zoe»] my_list.sort() print(«case sensitive list:») print(my_list) my_list.sort(key=str.lower) print(«case insensitive list:») print(my_list)

Тогда при отображении списка в шаблонах элементы уже будут отсортированы.

Оцените статью
Добавить комментарий