所以我一直在试图弄清楚如何在模板中渲染相关对象。我一直在尝试使用模板中的查询集来完成它,但我可能完全错了,我需要对上下文做一些事情。无论哪种方式,我都不知道我应该做什么。
我想做什么:
获取一个包含将要发布的提示的查询集。
在查询集的帮助下,呈现城市的提示列表。列表本身是站点和所述站点的提示数量以及特定区域的提示总数。
我想在模板中呈现的内容
Uptown (3)
K-Jah (2)
Chatterbox FM (1)
Staunton Island (1)
Lips 106 (1)
我一直在努力:
<table>
{% for object in object_list %}
<tr>
<th>Region</th>
</tr>
<tr>
<td>{{ object.station.region }} </td>
<tr>
<th>Station</th>
<td>{{ object.station.name }}</td>
{% endfor %}
</table>
现在这显然是错误的,我知道。它循环并多次呈现相同的区域和站名称,并且我不呈现区域或站点在循环中出现的次数。
我的模型设置如下:
models.py
class Tip(models.Model):
name = models.TextField(verbose_name=_('name'), blank=True, null=True)
email = models.EmailField(verbose_name=_('email'), max_length=50, blank=True, null=True)
description = models.TextField(verbose_name=_('description'), blank=True, null=True)
comment = models.TextField(max_length=255, blank=True, null=True)
published = models.BooleanField(default=False, verbose_name=_('published'))
class NamedModel(models.Model):
name = models.CharField(verbose_name=_('name'), max_length=255)
def __unicode__(self):
return u'%s' % self.name
class Region(NamedModel):
def __unicode__(self):
return u'%s' % self.name
class Station(models.Model):
name = models.CharField(verbose_name=_('name'), max_length=255)
phone = models.CharField(verbose_name=_('phone'), max_length=255, blank=True)
region = models.ForeignKey(Region, verbose_name=_('region'))
def __unicode__(self):
return u'%s' % self.name
class StationTip(Tip):
station = models.ForeignKey(Station, verbose_name=_('station'))
def __unicode__(self):
return u'%s' % self.school
查询集:
K-Jah region = Uptown
Chatterbox region = Uptown
Lips 106 region = Staunton Island
StationTip.objects.all().filter(published=True)
查询集返回的内容:
[<StationTip: K-Jah>, <StationTip: K-Jah>, <StationTip: Lips 106>, <StationTip: Chatterbox FM>]
答案 0 :(得分:1)
您要使用的是annotate
函数与values
函数的组合:
from django.db.models import Count
tips = StationTip.objects.filter(published=True).values('station__name', 'station__region').annotate(count=Count('id'))
这将创建一个列表,其中包含station.name
和station.region
的每个唯一组合的字典,以及额外的键count
和出现次数。
在您的模板中(如果您将提示作为object_list传递):
<table>
{% for object in object_list %}
<tr>
<th>Region</th>
<th>Station</th>
<th>Count</th>
</tr>
<tr>
<td>{{ object.station__region}} </td>
<td>{{ object.station__name }}</td>
<td>{{ object.count }}</td>
</tr>
{% endfor %}
</table>