Должны ли кверисеты Django вызываться в шаблонах или передаваться в контекст шаблона?

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

В шаблоне Django вы можете использовать .all для получения кверисета вещей, например, так:

{% for prerequisite in object.prerequisites.all %}
  <li class="list-group-item">{{ prerequisite.text }}</li>
{% endfor %}

Модель в данном случае выглядит так, но единственная релевантная часть информации заключается в том, что object выше имеет отношение к модели Prerequisite через ForeignKey.

class Prerequisite(models.Model):
    content = models.ForeignKey(Content, on_delete=models.CASCADE,
                                related_name='prerequisites')
    text = models.CharField(max_length=100)

    def __str__(self):
        return str(self.text)
< <
def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['prerequisites'] = self.object.prerequisites.all()
    return context
Является ли лучшей практикой вызывать Django querysets в шаблоне, (т.е. ) или нужно передавать его в представление через контекст?

Очень удобно делать кверисет в шаблоне, но кажется, что это должна быть бизнес-логика, расположенная в представлении. Есть ли у Django особая позиция по этому поводу?

согласно документации django:

Слой представлений - В Django есть концепция "представлений" для инкапсуляции логики, ответственной за обработку запроса пользователя и возврат ответа.

Слой шаблонов - Слой шаблонов обеспечивает удобный для дизайнера синтаксис для визуализации информации, которая должна быть представлена пользователю.

У меня другой пример, я знаю, что многие программисты любят переносить логику бизнеса из views.py в serializer.py, даже если изначальная цель жизни серийников - to serialize

я считаю, что наиболее подходящим способом является pass your data through context в представлениях.

Views изначально - это вся ваша логика, serializer предполагает только сериализацию, а цель шаблонов - показать html страницу, python изначально не был предназначен для работы с html страницей

Вернуться на верх