Django - 分组数据并在模板中显示选择的名称

Posted

技术标签:

【中文标题】Django - 分组数据并在模板中显示选择的名称【英文标题】:Django - Grouping data and showing the choices's name in template 【发布时间】:2021-04-03 08:05:57 【问题描述】:

我正在尝试创建一个饼图 (chart.js)。我的目标是对标题进行分组并在饼图中按标题显示有多少人工作。

Models.py

class Personel(models.Model):
    name = models.CharField(max_length=30)
    surName = models.CharField(max_length=20)
    titles= models.IntegerField(choices=((1,"Researcher"),(2,"Technician"),(3, "Support Personel")),default=1)

    def __str__(self):
        return f"self.name,self.surName"

    class Meta:
        db_table = "personel"
        verbose_name_plural = "Ar-Ge Personeller"


Views.py

def index(request):
    personel_titles = Personel.objects.values('titles').annotate(Count('titles'))
    context = 
        "personel_titles" : personel_titles,
    
    return render(request, 'core/index.html',context)
>>> print(personel_titles)

>>> 'titles': 1, 'titles__count': 10
'titles': 2, 'titles__count': 11
'titles': 3, 'titles__count': 3>

对我来说没问题,我需要的都在这里。但我不知道如何在模板中显示标题名称(也在图表标签中)

模板

% for title in personel_titles %<p> title.get_titles_display </p>% endfor %

我错过了什么?如何在值中返回选择的名称?

【问题讨论】:

【参考方案1】:

这里需要一点技巧,因为 Group By 表达式是在数据库级别执行的,而 get_FOO_display() 方法是在 python 级别执行的。

因此,在将值发送到模板之前,您需要将 display 值附加到上下文中,

def index(request):
    personel_titles = Personel.objects \
        .values('titles') \
        .annotate(Count('titles'))
    
    for title in personel_titles:
        title["titles_display"] = Personel(titles=title["titles"]).get_titles_display()

    context = 
        "personel_titles": personel_titles,
    
    return render(request, 'core/index.html', context)

然后在您的模板中,

% for title in personel_titles %
    <p> title.titles_display  ---  title.titles__count </p>
% endfor %

【讨论】:

以上是关于Django - 分组数据并在模板中显示选择的名称的主要内容,如果未能解决你的问题,请参考以下文章

如何将相等的数据分组并在模板中显示

Django迭代列表中的字典并在模板中显示数据

基于选择的 Django 模板/ChoiceField 显示字段

Django:如何使用查询集并在模板中显示结果?

Django如何循环对象并在模板中显示变量

如何使用 django rest 框架在模板中获取模型选择字段名称而不是 id