2016-05-01 3 views
16

Я хочу добавить некоторую гибкость в свой шаблон макета, но не могу найти способ сделать это.Это способ передать переменную в расширенный шаблон в 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 %} 

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

+0

@xpy, неа. В моем вопросе я ищу способ расширения шаблона макета с переменной, т. Е. Передать переменную в дереве шаблонов не вниз. –

+0

Извините, неправильно поняли. – xpy

+3

Почему вы не передадите переменные с контекстом «render (request,« child.html », {'sidebar_width':" width_4 "})'? –

ответ

2

Я подозреваю, что 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%} 
+0

nope .. ваш пример о передаче переменных вниз. Когда мы создаем шаблоны и расширяем макет, у нас нет такой возможности. –

+0

Я обновил свой вопрос, надеюсь, теперь было бы более понятно. –

+0

@AlexT как это «вниз»?'Sidebar_wrapper' находится в родительском шаблоне и в дочернем шаблоне, вы определяете, какие значения использовать в блоке родительского шаблона с помощью оператора' with'. – xpy

5

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

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

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

+4

Я хочу расширить шаблон, чтобы не включать его. –

+0

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

+0

sidebar определенно есть, что относительно шаблонов макета без боковой панели? f.e. У меня есть страницы с боковой шириной 3, шириной4 и без боковой панели. Контентная часть этих трех макетов отличается друг от друга, а разметка части содержимого довольно сложна, чтобы включать ее каждый раз в {% block content%} –

Смежные вопросы