0

所以我一直在试图弄清楚如何在模板中呈现相关对象。我一直在尝试使用模板中的查询集来做到这一点,但我可能完全错了,我需要对上下文做一些事情。无论哪种方式,我都不知道我应该做什么。

我想做的事:

获取包含将要发布的提示的查询集。

在查询集的帮助下,呈现城市的提示列表。该列表本身是站点和该站点的提示数以及特定区域的提示总数。

我想在我的模板中呈现什么

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>

现在这显然是错误的,我知道。它循环并多次呈现相同的区域和站点名称,并且我不呈现区域或站点在循环中出现的次数。

我的模型设置如下:

模型.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 地区 = 住宅区

Chatterbox 地区 = 住宅区

嘴唇 106 地区 = 斯汤顿岛

StationTip.objects.all().filter(published=True)

查询集返回的内容:

[<StationTip: K-Jah>, <StationTip: K-Jah>, <StationTip: Lips 106>, <StationTip: Chatterbox FM>]
4

1 回答 1

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.namestation.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>
于 2013-08-01T20:46:21.580 回答