вывести их на фронтэнд в алфавитном порядке так:
А
Абакан
Альметьевск
Астрахань
Б
Батайск
Белгород
Бийск
...
Текущий код views.py циклом for обходит названия городов и, если первая буква города есть в алфавите, - добавляет букву в новый алфавит:
for city in cities:
if city[0] in alphabet:
my_alphabet.append(city[0])
my_alphabet = sorted(list(set(my_alphabet)))
Далее передаю новый алфавит и названия городов в шаблон html:
{% for letter in my_alphabet %}
<span>{{ letter }}</span>
{% for city in cities %}
{% if city.0 == letter %}
<span>{{ city }}</span>
{% endif %}
{% endfor %}
{% endfor %}
Загрузка страницы занимает до 10 сек
Может, есть у кого вариант попроще?
сделай ордер сразу в базе
The built-in template tag regroup can be used to loop through a list/queryset and group by a common attribute. from django.db.models.functions import Substr cities= City.objects.order_by('name').annotate( first_letter=Substr('name', 1, 1) ) The above queryset gives all City instances annotated with the first letter of the name field. You can then use this in the regroup tag {% regroup cities by first_letter as letters %} {% for letter in letters %} <span>{{ letter.grouper }}</span> {% for city in letter.list %} <span>{{ city.name }}</span> {% endfor %} {% endfor %}
Обсуждают сегодня