Подтвердить что ты не робот

Django группирует запрос по первой букве?

У меня есть QuerySet, например:

items = Item.objects.all()

Элемент имеет поле "имя". В шаблоне я хочу показать:

  • А
  • Топоры
  • Alcohol
  • В
  • базуки
  • С
  • Монеты
  • Картриджи
  • S
  • Мечи
  • Воробьи

Итак, элементы упорядочены и группируются по первой букве. Пропущенные буквы опущены. У кого-нибудь есть идеи?

4b9b3361

Ответ 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