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>