Макроси в 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 docs, че шаблоните на django нямат макро тагове. Интересувам се от най-добрия начин да направя нещо подобно в django шаблони.


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


Отговори (5)


Както вече казахте, макросите не съществуват в езиците за шаблони на django.

Има етикети за шаблони, за да правите по-трудни неща в шаблоните, но това също не е това, което търсите, защото системата за шаблони на django също не позволява предаването на параметри към функциите.

Най-доброто нещо за вашия пример би било да използвате етикета за включване:
https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#include

Ето как бих го използвал:

templates/snippets/list.html

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

templates/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

template/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%}

templates/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 Template Language макросите не се поддържат, но можете да изберете двигателя Jinja, за да използвате макроси. Имайте предвид, че ако създавате plugable приложение, Django препоръчва използването на DTL.

Django проект може да бъде конфигуриран с една или няколко шаблонни машини (или дори нула, ако не използвате шаблони). Django доставя вграден бекенд за собствената си шаблонна система, креативно наречена Django template language (DTL), и за популярната алтернатива Jinja2.

Езикът за шаблони Django е собствената система за шаблони на Django. До Django 1.8 това беше единствената налична вградена опция. Това е добра библиотека с шаблони, въпреки че е доста убедена и има няколко особености. Ако нямате неотложна причина да изберете друг бекенд, трябва да използвате DTL, особено ако пишете приложение с възможност за добавяне и възнамерявате да разпространявате шаблони. Приложенията на Django, които включват шаблони, като django.contrib.admin, използват DTL.

Ето връзката към документацията за конфигуриране на други машини за шаблони: https://docs.djangoproject.com/en/dev/topics/templates/#configuration

person jorge4larcon    schedule 27.03.2021