Django:在字母标题下列出查询集结果

Django: Listing queryset results under alphabetical headings

我试图在基于文章标题的字母标题下列出 'Articles' 的查询结果,例如:

A

B

等等

我知道我可以在视图中使用查询集和过滤器手动执行此操作,但是是否有更多的 pythonic 方法?我最初的想法是模板中的一对 for 循环,一个是字母表,另一个是文章,类似 {% if article.startwith({{ letter}}) %} 但我不认为包含在 Django 模板语言中。

型号:

class Article(models.Model):
title = models.CharField(max_length=200)
tagline = models.CharField(max_length=75, blank=False, default='Required')
author = models.ForeignKey(
    get_user_model(),
    on_delete=models.SET_NULL,
    null = True
    )
created = models.DateTimeField(auto_now_add=True)
department = models.ForeignKey(Department, on_delete=models.SET_NULL, null=True, blank=True)
tags = TaggableManager()
banner_image = models.ImageField(upload_to='wiki_images/banners', null=True, blank=True)
body = models.TextField()

我也考虑过 Django 重组标签,但很难理解如何将它传递给每篇文章标题的第一个字母。

运行 这个项目上的 Django 3.1。 编辑:错别字

使用重组是个好主意!

但是要对某些内容进行分组,我们还需要用第一个字母来注释我们的查询集,以便对某些内容进行分组。

试试这个:

from django.db.models.functions import Substr, Upper

articles = Article.objects.annotate(first_letter=Upper(Substr('title', 1, 1)))

然后在模板中

{% regroup articles by first_letter as first_letter_articles %}
{% for first_letter in first_letter_articles %}
    <li>{{ first_letter.grouper }}
    <ul>
        {% for article in first_letter.list %}
          <li>{{ article.title }}</li>
        {% endfor %}
    </ul>
    </li>
{% endfor %}