Лучший способ разделить шаблон на секции? (несколько циклов for с несколькими запросами?) (Django)

У меня есть модель, в которой перечислены проекты - одно из этих полей записывает состояние проекта как внешний ключ к модели состояния.

Я хотел бы иметь представление, в котором проекты перечислены, но разделены по статусу, например.

    <h1 class="main_title">Projects</h1>

 <h2>Projects with a Status of 1<h2>
{% for projects in projects %}

<h3>> {{ projects.name_title_working }}</h3>
<p>> {{ projects.fk_state }}</p>
<p>> {{ projects.genre }}
<p>> {{ projects.d_conceived }}

{% endfor %}

<h2>Projects with a Status of 2<h2>
{for loop}

<h2>Projects with a Status of 3<h2>
{for loop}

etc.

Как я буду запрашивать на уровне шаблона, как это делается, или нужны дополнительные шаги, где запрос выполняется на более низком уровне?

Предположим, что ваши модели выглядят примерно так:

from django.db import models


Project(models.Model):
    name = models.CharField(max_length=50)
    status = models.ForeignKey(Status, on_delete=models.SET_NULL, null=True)

Status(models.Model):
    state_id = models.IntegerField()

Вы можете "отфильтровать" соответствующие проекты с помощью if-условия в шаблоне:

<h1 class="main_title">Projects</h1>

<h2>Projects with a Status of 1<h2>
{% for project in projects %}
    {% if project.status.state_id == 1 %}

    <h3>{{ project.name }}</h3>
    <p>{{ project.status }}</p>

    {% endif %}
{% endfor %}

<h2>Projects with a Status of 2<h2>
{% for project in projects %}
    {% if project.status.state_id == 2 %}

    <h3>{{ project.name }}</h3>
    <p>{{ project.status }}</p>

    {% endif %}
{% endfor %}

[...]

Если у вас также есть кверисет всех возможных состояний, доступный как переменная шаблона, вы можете даже уменьшить количество кода, который вы пишете, используя вложенный цикл:

<h1 class="main_title">Projects</h1>

{% for s in status %}
    <h2>Projects with a Status of {{ s.state_id }}<h2>
    {% for project in projects %}
        {% if project.status == s %}
        
        <h3>{{ project.name }}</h3>
        <p>{{ project.status }}</p>

        {% endif %}
    {% endfor %}
{% endfor %}

Я думаю, что это должно работать хорошо, пока количество проектов и государств относительно невелико. Если вы имеете дело с очень большим количеством проектов и государств, эти решения могут быть слишком неэффективными.

Встроенный тег шаблона regroup делает то, что вы хотите.

{% regroup projects by status as status_list %}
{% for status in status_list %}
<h2>Project of status {{ status.grouper }}</h2>
<ul>
  {% for project in status.list %}
     <li>{{ project.name }}</li>
  {% endfor %}
</ul>
{% endfor %}
Вернуться на верх