Это способ передать переменную в расширенный шаблон в Django?

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

Я ищу способ шаблона макета extend с переменной, т.е. передать переменную в дереве шаблонов не вниз.

# views.py
def my_view_func(request):
    return render(request, "child.html")

# child.html
{% extends 'layout.html' with show_sidebar=True sidebar_width_class="width_4" %}

<div>Templates stuff here</div>

# layout.html
{% if show_sidebar %}
    <div class="{{ sidebar_width_class }}">
        {% block sidebar %}{% endblock %}
    </div>
{% endif %}

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

Ответы

Ответ 1

Я подозреваю, что block - это то, что вы ищете в первую очередь.

Создайте свой блок внутри базового шаблона следующим образом:

{% block sidebar_wrapper %}
    {% if sidebar %}
    <div class="width{{sidebar_width}}">
        {% block sidebar %}{% endblock %}
    </div>
    {% endif %}
{% endblock sidebar_wrapper%}

И на вашем дочернем шаблоне:

{% extends 'layout.html' %}
{% block sidebar_wrapper %}
    {% with sidebar=True sidebar_width=4 %}
        {{ block.super }}
    {% endwith%}
{% endblock sidebar_wrapper%}

Ответ 2

Что вам нужно, так это тег шаблона include. Вы можете включить шаблон в другой шаблон и отобразить его в определенном контексте.

{% include 'layout.html' with sidebar=True sidebar_width=4 %}

Проверьте документы здесь: https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#include