Лучший способ разделить шаблон на секции? (несколько циклов 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 %}