Django группирует запрос по первой букве?
У меня есть QuerySet, например:
items = Item.objects.all()
Элемент имеет поле "имя". В шаблоне я хочу показать:
- А
- Топоры
- Alcohol
- В
- базуки
- С
- Монеты
- Картриджи
- S
- Мечи
- Воробьи
Итак, элементы упорядочены и группируются по первой букве. Пропущенные буквы опущены. У кого-нибудь есть идеи?
Ответы
Ответ 1
Там есть тег шаблона, если все, о чем вы заботитесь, это его презентация на странице. Во-первых, определите организационный принцип в классе. В вашем случае это первая буква:
class Item(models.Model):
...
def first_letter(self):
return self.name and self.name[0] or ''
И затем определите группу в шаблоне, используя вызов first_letter:
{% regroup items by first_letter as letter_list %}
<ul>
{% for letter in letter_list %}
<li>{{ letter.grouper }}
<ul>
{% for item in letter.list %}
<li>{{ item.name }}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
Ответ 2
Просто хотел добавить, что если вы используете это, и ваш элемент имеет нижний регистр первого символа, он будет отдельной группой. Я добавил верхнюю часть.
return self.name and self.name.upper()[0] or ''
Ответ 3
В качестве альтернативы вы можете использовать slice
inline в шаблоне без использования метода first_letter
на вашей модели.
{% regroup items by name|slice:":1" as letter_list %}
<ul>
{% for letter in letter_list %}
<li>{{ letter.grouper }}
<ul>
{% for item in letter.list %}
<li>{{ item.name }}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
Ответ 4
Еще проще. Вы можете группировать первый летер только в "перегруппировке":
{% regroup items|dictsort:"name" by name.0 as item_letter %}
<ul>
{% for letter in item_letter %}
<h4>{{ letter.grouper|title }}</h4>
{% for i in letter.list|dictsort:"name" %}
<li>{{ i.name }}</li>
{% endfor %}
{% empty %}
<span>There is no items yet...</span>
{% endfor %}
</ul>
name.0
в этом случае то же, что и item.name[0]
в Python.
Протестировано в Django 1.10