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 %}
我试图在基于文章标题的字母标题下列出 '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 %}