Django - 访问我的模板中按特定值过滤的查询集的计数

Django - accessing a count of a queryset filtered by specific value in my template

我什至在制定这个问题的标题时遇到了问题 :) 我在所有编码方面都是初学者,但我很喜欢通过 Django 项目学习。通常我可以通过搜索来一点一点地解决我的问题,但是我在下面失败了并且卡住了,虽然我确信有一个简单的解决方案......在下面我在我的 html 代码中执行以下操作:

第 1 步。根据我的观点,我正在获取按字段“region”排序的上下文“programmes”并使用它来列出使用 for 循环为每个区域包含属于该区域的程序列表。

第 2 步。在每个程序的 table 的第二列中,我显示了数据库中该特定程序的合作伙伴总数(使用 related_name 'PartofProgramme' 表示外键)。到目前为止一切顺利,一切正常。

第 3 步。当我在此阶段检查时,'programme.Partof Programme.all' 包含如下查询集:“< QuerySet [, , etc etc. 列出属于过滤程序的所有合作伙伴。对于 table 中的第三列,我想显示 status__code value = ‘active’ 的这些合作伙伴的数量。我如何从我的 html 模板访问它,它现在在下面显示“##get count of active partners##”?

从我下面的代码中截取。

index_alt.html

{% regroup programmes by region as region_list %}
[…]
<div class="tab-content">
  {% for region in region_list %}
[...]
            <tr>
                <th scope="col">Programmes in {{region.grouper }} </th>
                <th scope="col">Registered partners</th>
                <th scope="col">Active</th>
            </tr>
            </thead>
            
            <tbody>
            {% for programme in region.list|dictsort:"programme"  %}
            <tr>
                <th scope="row">{{ programme }}</th> #name of programme in region in rows
                <td>{{ programme.PartofProgramme.all.count }}</td> #number of registered partners in programme
                <td> {{  ##get count of active partners## }}</td> #get number of partners with status__code=’active’
            </tr>
            {% endfor %}
            </tbody>
        </table>
  </div>
  {% endfor %}

views.py

class DevView(generic.ListView):
    template_name = "maindb/index_alt.html"
    model = Programme

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['programmes'] = Programme.objects.all().order_by('region')
        return context

models.py

class Region(models.Model):
    region = models.CharField(max_length=200)

class Programme(models.Model):
    programme = models.CharField(max_length=200)
    region = models.ForeignKey('Region', on_delete=models.SET_NULL, null=True, blank=True,  related_name="regions", verbose_name="Region")

class TagStatus(models.Model):
    code = models.CharField(max_length=20)
    field = models.CharField(max_length=100, null=False)

class Partner(models.Model):
    name = models.CharField(max_length=200)
    programme = models.ForeignKey('Programme', on_delete=models.SET_NULL, null=True, blank=True,    related_name="PartofProgramme")
    status = models.ForeignKey('TagStatus', on_delete=models.SET_NULL, null=True, blank=True)

您可以使用自定义过滤器。

示例:

@register.filter
def status_active_count(partners):
    return partners.filter(status__code="active").count()

# in template
{{ programme.PartofProgramme.all|status_active_count }}

您可以在此处阅读更多内容: https://docs.djangoproject.com/en/4.0/howto/custom-template-tags/#registering-custom-filters