Django - доступ к подсчету набора запросов, отфильтрованных по определенному значению в моем шаблоне

У меня были проблемы даже с формулировкой названия этого вопроса :) Я очень начинающий во всем, что касается кодирования, но мне нравится учиться на проекте Django. Обычно я могу понемногу решать свои проблемы путем поиска, но я потерпел неудачу и застрял, хотя я уверен, что есть простое решение... Ниже я делаю следующее в своем html-коде:

шаг 1. Из моих представлений я получаю контекст 'programmes' отсортированный по полю 'region' и использую его для списка для каждого региона со списком программ, принадлежащих региону, используя цикл for.

Шаг 2. Во втором столбце таблицы для каждой программы я показываю количество всех партнеров в базе данных для этой конкретной программы (используя related_name 'PartofProgramme' для внешнего ключа). Пока все хорошо и все работает нормально.

шаг 3. Когда я проверяю на этом этапе, 'programme.Partof Programme.all' содержит набор запросов следующим образом: "<QuerySet [<Partner: examplepartner1>, <Partner: examplepartner2>, etc etc. перечисляет всех партнеров, принадлежащих к отфильтрованной программе. Для третьего столбца таблицы я хочу показать количество этих партнеров со значением status__code = '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)

Я думаю, что простой способ - предоставить отфильтрованный набор запросов в контексте в get_context_data.

`context['active_partners'] = Programme.PartofProgramme.filter(status__code="active")`

Другой способ - использовать пользовательские фильтры. Подробнее можно прочитать здесь: https://docs.djangoproject.com/en/4.0/howto/custom-template-tags/#registering-custom-filters

Пример:

@register.filter
def status_active_count(partners):
    return partners.filter(status__code="active").count()
Вернуться на верх