【问题标题】:Django: Listing queryset results under alphabetical headingsDjango:在字母标题下列出查询集结果
【发布时间】:2022-01-14 10:27:51
【问题描述】:

我正在尝试根据文章标题在字母标题下列出“文章”查询的结果,例如:

一个

  • 苹果
  • 食蚁兽

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。 编辑:错字

【问题讨论】:

    标签: django django-views


    【解决方案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 %}
    

    【讨论】:

    • 完美!我知道编写 26 英里的查询集并不是最好的方法!
    猜你喜欢
    • 1970-01-01
    • 2019-12-19
    • 2021-12-12
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 2020-06-13
    相关资源
    最近更新 更多