Макросы в шаблонах django

В jinja я могу создавать макросы и вызывать их в своем шаблоне следующим образом:

{% macro create_list(some_list) %}
<ul>
    {% for item in some_list %}
    <li>{{ item }}</li>
    {% endfor %}
</ul>
{% endmacro %}

HTML code....

{{ create_list(list1) }}
{{ create_list(list2) }}
{{ create_list(list3) }}

Я читал в документах django, что шаблоны django не имеют тега макроса. Меня интересует лучший способ сделать что-то подобное в шаблонах django.


person Dima Kudosh    schedule 25.07.2015    source источник


Ответы (5)


Как вы уже сказали, макросы не существуют в языках шаблонов django.

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

Лучше всего для вашего примера использовать тег include:
https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#include

Вот как я бы его использовал:

шаблоны/сниппеты/list.html

<ul>
{% for item in list %}
   <li>{{ item }}</li>
{% endfor %}
</ul>

шаблоны/index.html

{% include 'snippets/list.html' with list=list1 %}
{% include 'snippets/list.html' with list=list2 %}
{% include 'snippets/list.html' with list=list3 %}
...
person Chris Schäpers    schedule 25.07.2015

Я нашел два пакета, чтобы предложить это:

они оба работают одинаково: установите с помощью pip, поместите INSTALLED_APPS, {% load macros %} в шаблон, напишите и используйте их.

person Ehvince    schedule 10.03.2017

шаблон/partials/example-partial.html

{%if partial_name == 'partial1'%}
<ul>
{% for item in list %}
   <li>{{ item }}</li>
{% endfor %}
</ul>
{%endif%}


{%if partial_name == 'partial2'%}
<ul>
{% for item in list %}
   <li>{{ item }}</li>
{% endfor %}
</ul>
{%endif%}


{%if partial_name == 'partial3'%}
<ul>
{% for item in list %}
   <li>{{ item }}</li>
{% endfor %}
</ul>
{%endif%}

шаблоны/index.html

{% include 'partials/example-partial.html' with list=list1 partial_name="partial1"%}
{% include 'partials/example-partial.html' with list=list2 partial_name="partial2"%}
{% include 'partials/example-partial.html' with list=list3 partial_name="partial3"%}
person Afsal KK    schedule 09.02.2017

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

person Sławomir Lenart    schedule 14.02.2018

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

Проект Django может быть настроен с одним или несколькими механизмами шаблонов (или даже без, если вы не используете шаблоны). Django поставляет встроенные серверные части для собственной системы шаблонов, творчески названной языком шаблонов Django (DTL), и для популярной альтернативы Jinja2.

Язык шаблонов Django — это собственная система шаблонов Django. До Django 1.8 это была единственная доступная встроенная опция. Это хорошая библиотека шаблонов, хотя она довольно самоуверенна и имеет несколько особенностей. Если у вас нет веских причин для выбора другого бэкенда, вам следует использовать DTL, особенно если вы пишете подключаемое приложение и собираетесь распространять шаблоны. Contrib-приложения Django, включающие шаблоны, такие как django.contrib.admin, используют DTL.

Вот ссылка на документацию по настройке других механизмов шаблонов: https://docs.djangoproject.com/en/dev/topics/templates/#configuration

person jorge4larcon    schedule 27.03.2021