Повторное использование шаблонов django?

Я считаю, что язык шаблонов django очень ограничен. Следуя принципу django DRY, у меня есть шаблон, который я бы хотел использовать во многих других шаблонах. Например, список пациентов:

    {% for physician in physicians.all %}
        {% if physician.service_patients.count %}
            <div id="tabs-{{ forloop.counter }}">
                {% include "hospitalists/patient_list.html" %}
            </div>
        {% endif %}
    {% endfor %}

Проблема заключается в том, что шаблон patient_list ожидает список пациентов с именем patients. Как переименовать physician.service_patients в patients, прежде чем включать шаблон?

Спасибо, Пит

Ответ 1

Использовать тег with:

{% for physician in physicians.all %}
   {% if physician.service_patients.count %}
      {% with physician.service_patients as patients %}                   
         <div id="tabs-{{ forloop.counter }}">
            {% include "hospitalists/patient_list.html" %}
         </div>
      {% endwith %}
   {% endif %}
{% endfor %}

Вы также можете перейти на создание настраиваемого тега:

{% for physician in physicians.all %}
   {% if physician.service_patients.count %}
      {% patient-list physician.service_patients %}
   {% endif %}
{% endfor %}

Хотя пользовательские теги связаны с написанием кода Python, есть ярлыки, которые упрощают использование существующего файла шаблона в качестве тега: Теги включения в Django

Ответ 2

Когда у вас есть "функциональность" (в частности, if-condition) внутри цикла, у вас есть возможность переместить это в функцию просмотра.

Первая

Эта конструкция

{% for physician in physicians.all %}
    {% if physician.service_patients.count %}
    {% endif %}
{% endfor %}

Общеизвестно, что у вас есть несколько способов избежать этого.

  • Измените свою модель. Добавьте тест patients" method and use it instead of the default query set that you get with a on-to-many relationship. This method of your model has the, если service_patients.count`, удалив его из вашего шаблона.

    Это устраняет {% if%} из вашего шаблона, уменьшая его до {% for%} и фактического HTML, который не может быть легко устранен.

  • Измените функцию просмотра. Напишите несколько строк кода, чтобы создать список врачей с service_patients вместо упрощенного набора врачей. Этот код в вашей функции просмотра имеет тег if service_patients.count, удаляя его из вашего шаблона.

    Это устраняет {% if%} из вашего шаблона, уменьшая его до {% for%} и фактического HTML, который не может быть легко устранен.

Цель состоит в том, чтобы избавиться от {% if%}, чтобы вы просто сокращали {% for%} и фактический HTML. Сохраняя шаблон только в HTML (который не может быть устранен), единственными накладными расходами являются {% for%}

Второй

Похоже, вы хотите повторно использовать конструкцию {% include %} в несколько разных контекстах.

Не совсем ясно, что проблема с этим файлом {% include %}. Это "ожидание списка пациентов с именем patients" кажется поверхностным глупо. Исправьте его, поэтому он ожидает physician.patients.

Возможно, вы хотите использовать этот же список дважды. Один раз со списком, который называется 'patients', и один раз со списком 'physician.patients'. В этом случае рассмотрим (a) упрощение или (b) запись тега шаблона.

Похоже, у вас есть список пациентов, который иногда представляет собой отдельную страницу, а иногда повторяется много раз на гораздо более сложной странице. Повторение списка деталей, встроенных в какой-то более длинный список, на самом деле не лучший дизайн страницы. Django не помогает вам в этом, потому что, честно говоря, людям это нелегко использовать. Следовательно, вариант (a) - рассмотрите пересмотр этого списка "список пациентов в пределах врача" как слишком сложный.

Однако вы всегда можете писать теги шаблонов для создания действительно сложных страниц.

Резюме

Там действительно хорошая причина, почему язык шаблона Django имеет ограниченную функциональность. Все ваши функции должны быть либо существенной особенностью вашей модели, либо особенностью текущего приложения, использующего модель.

Презентация - это просто перевод объектов (и запросов) в HTML. Ничего больше

Ответ 3

Как способ, вы можете попробовать использовать в качестве языка шаблонов jinja. Это более гибко.