несколько произвольных блоков в макросах Jinja2

Я использую как Jinja2, так и Nunjucks (в зависимости от проекта), но еще не придумал, как создавать повторно используемые элементы с несколькими блоками, содержащими произвольный HTML. Например (псевдокод):

{% macro item(class) %}
    <article class="{{ class }}">
        <h3>{{ caller(1) }}</h3>
        <p>{{ caller(2) }}</p>
    </article>
{% endmacro %}

{% call item %}
    Hello <abbr title="...">world</abbr>!
    {% ---- %}
    lorem <em>ipsum</em> dolor <strong>sit</strong> amet
{% endcall %}

Передача HTML соответствующих блоков в виде обычных аргументов (то есть строк) в макрос кажется нереальной.

Менее надуманным примером могут быть формы в стиле Bootstrap:

<div class="form-group">
    <label for="{{ id }}" class="control-label">$label</label>
    <input type="{{ type }}" id="{{ id }}">
    <p class="help-block">$hint</p>
</div>

Здесь и $label, и $hint могут быть произвольными блоками HTML — возможно, даже может быть несколько полей, определенных вне макроса.

Какой рекомендуемый подход здесь?


person AnC    schedule 23.07.2014    source источник
comment
Мне непонятно, чего вы хотите добиться. Что вы хотите получить, и как в идеале должен выглядеть код для этого?   -  person Julian    schedule 01.08.2014


Ответы (2)


Вы можете найти это полезным для повторно используемых компонентов HTML:

https://github.com/mozilla/nunjucks/pull/277

Пример:

{% include 'search-box.html.twig' with {placeholder: 'Search users'} %}
person Amy B    schedule 13.09.2014

Вы можете использовать встраиваемый тег из atpl шаблонизатор. Пример:

{% embed "teasers_skeleton.twig" %}
    {# These blocks are defined in "teasers_skeleton.twig" #}
    {# and we override them right here:                    #}
    {% block label %}
        Some content for the label box
    {% endblock %}
    {% block hint %}
        Some content for the hint box
    {% endblock %}
{% endembed %}
person Ivan Loenko    schedule 18.12.2014
comment
Это выглядит близко к тому, что я хочу - я просто не уверен, что смогу легко перенести свои существующие проекты Nunjucks в atpl; это, безусловно, стоит попробовать. Конечно, это не поможет мне с Python Jinja2, хотя... - person AnC; 30.12.2014
comment
Использовать другой механизм шаблонов — не очень хороший/разумный ответ ???? - person Jemar Jones; 05.11.2020