Как расширить base.html использование двух разных файлов?

#django #django-templates

#джанго #django-шаблоны

Вопрос:

Я пишу приложение, в котором пользователь может выбрать один из нескольких инструментов для анализа данных и открыть его на панели на главной странице. Можно ли использовать django «extends» и определить каждый инструмент в разных файлах?

Минимальный пример того, с чем я борюсь, был бы таким:

base.html

   <div>
  {% block left_panel %}
  left block
  {% endblock content%}
  </div>
  <div>
    {% block right_panel %}
    right block
    {% endblock %}
  </div>
 

и примеры инструментов left_panel и right_panel:

left1.html

 {% extends "base.html" %}
{% block left_panel %}
<p>TEST left 1</p>
{% endblock %}
 

right1.html

 {% extends "base.html" %}
{% block right_panel %}
<p>TEST right 1</p>
{% endblock %}
 

Есть ли способ визуализировать base.html с перезаписанными обоими блоками?

Ответ №1:

Я считаю, что лучший способ реализовать ваше требование — создать новый шаблон, который расширяет base.html и включает в себя left1.html и right1.html . Что-то вроде этого:

{% расширяет "base.html " %}

{% блокировать левую панель %}
 {% включить "left1.html " %}
{% содержимое конечного блока%}

{% блокировать правую панель %}
 {% включить "right1.html " %}
{% endblock %}

Обновление на основе комментария OP: на самом деле вам нужен только один настраиваемый шаблон, а не 100. Допустим, что на основе инструментов, выбранных пользователем, ваше представление передает left_tool right_tool переменные контекста и в ваш шаблон. Теперь вы можете легко сделать что-то вроде этого:

{% блокировать левую панель %}
 {% if left_tool == "tool1" %}
 {% включить "left1.html " %}
 {% elif left_tool == "tool2" %}}
 {% включить "left2.html " %}
 и т.д...
 {% else %}
 {% включить "left10.html " %}
 {% endif %}
{% содержимое конечного блока%}

Вы сделаете то же самое с правой панелью. Конечно, вышесказанное немного наивно и определенно не СУХО — вместо этого вы могли бы, например, сгенерировать имя шаблона, который будет включен в представление, и передать его непосредственно в шаблон или использовать пользовательский узел и т.д.

Комментарии:

1. Проблема в том, что для каждой панели есть 10 разных инструментов. Это означает 100 разных шаблонов, как вы предлагаете.