Шаблоны Django - лучшая практика в избежании повторяющегося кода, требующего различных циклов For?
Я создаю блог и имею множество страниц, которые будут отображать список статей. Поэтому, чтобы избежать повторения этого кода, я пытаюсь разместить его в родительском шаблоне, который я могу расширять по мере необходимости.
Проблема в том, что мне нужен разный цикл for для отображения списков статей на каждой странице/просмотре. Я полагаю, что самым простым подходом будет просто создать блоки, в которых я хочу, чтобы цикл начинался и закрывался в родительском, а затем соответствующим образом изменялся в каждом дочернем.
Однако, Django не позволяет вам закрывать блоки, в которых есть открытый цикл for, несмотря на закрытие цикла позже в другом блоке.
Мой первоначальный подход, в родительском файле article_list.html:
<div class="row">
{% block loop_start %}
{% endblock loop_start %}
<div class="col-xs-12 col-sm-4">
<div class="card">
<a class="img-card">
<img class="img-fluid"src="../../static/{{ post.featured_image }}" />
</a>.... etc
Я знаю, что мне нужно исправить мой src-код.
Распространяется на ребенка как:
{% block loop_start %}
{% for post in recent_articles %}
{% endblock loop_start %}
Однако это не работает, как было отмечено выше.
Я также попробовал обернуть весь код для списка статей в блок, расширить его и выполнить следующее в дочернем блоке:
{% for post in recent_articles %}
{% block.super article_list %}
{% endblock article_list %}
{% endfor %}
Это тоже не работает. Снова возникает та же ошибка, поскольку блок закрывается до завершения цикла. Я также попробовал закрыть цикл в родителе, что тоже не работает.
Есть ли более простой способ сделать это, который я упускаю? Я мог бы передать одну и ту же переменную каждому представлению, а затем реализовать цикл в родительском, но это кажется нелогичным и ограничивающим.
Что здесь является лучшей практикой?
Вам следует взглянуть на файл 'base.html'. Взгляните на эту веб-страницу: https://ultimatedjango.com/learn-django/lessons/create-the-project-base-template/
Это позволит вам сделать {% extends 'base.html' %}, все из которых Django будет обрабатывать.