Вопрос:
Я хочу отобразить список объектов в представлении общего класса 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)
Тогда при отображении списка в шаблонах элементы уже будут отсортированы.