Django grouping queryset by first letter? Django grouping queryset by first letter? django django

Django grouping queryset by first letter?


There's a template tag for this, if all you care about is its presentation on the page. First, define an organizational principle in the class. In your case, it's the first letter:

class Item(models.Model):    ...    def first_letter(self):        return self.name and self.name[0] or ''

And then define a regroup in the template, using the first_letter call:

{% 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>


Just wanted to add that if you use this and your item has a lower-case first character it will be a separate group. I added upper to it.

return self.name and self.name.upper()[0] or ''


Alternatively you could use slice inline in the template without the need for a first_letter method on your model.

{% 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>