Django按首字母分组查询集?

Tud*_*dor 12 sorting django django-templates

我有一个QuerySet,如:

items = Item.objects.all()
Run Code Online (Sandbox Code Playgroud)

项目有一个"名称"字段.在我想要显示的模板中:

  • 一个
  • 火箭筒
  • C
  • 硬币
  • 墨盒
  • 小号
  • 麻雀

所以这些物品是按照第一个字母排序和分组的.遗漏的字母被省略.有没有人有任何想法?

Elf*_*erg 19

如果您关心的是它在页面上的显示,那么就有一个模板标签.首先,在课堂上定义组织原则.在你的情况下,这是第一个字母:

class Item(models.Model):
    ...

    def first_letter(self):
        return self.name and self.name[0] or ''
Run Code Online (Sandbox Code Playgroud)

然后使用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>
Run Code Online (Sandbox Code Playgroud)

  • 您不需要该类的方法,因为您可以在regroup标记中使用过滤器.您可以执行`{%按名称重新组合项目| first | upper as letter_list%}` (5认同)

小智 6

只是想补充一点,如果您使用此项并且您的项目具有小写的第一个字符,则它将是一个单独的组.我加了鞋面.

return self.name and self.name.upper()[0] or ''
Run Code Online (Sandbox Code Playgroud)


小智 5

或者,您可以slice在模板中使用内联,而无需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>
Run Code Online (Sandbox Code Playgroud)