Должны ли кверисеты 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 страницей