Как зарегистрировать "динамический" тег включения в Django?

58
6

Как использовать ярлыки включения Django для вытягивания динамического шаблона на основе аргумента, предоставленного View?

Я создаю страницу "Загрузка" для контента на своем веб-сайте. Можно загрузить много разных частей контента, и я хочу использовать только одну страницу "Просмотр для загрузки", которая извлекает необязательные параметры из urls.py:

urls.py

url(r'^download/download-1/$', base_views.download, {
'name':'download-1',
'title':'Download 1',
'url':'https://sample-download-location.com/download-1.zip',
'upsell':'upsell-1'
}
),

url(r'^download/download-2/$', base_views.download, {
'name':'download-2',
'title':'Download 2',
'url':'https://sample-download-location.com/download-2.zip',
'upsell':'upsell-2'
}
),

views.py

def download(request, name, title, url, upsell):
return render(request, 'base/pages/download/download.html', {
'title': title,
'url': url,
'upsell': upsell,
}
)

download.html Часть 1

Информация из этого представления затем будет передана в шаблон загрузки так:

<div id="thank-you-content">
<div class="wrapper">
<h1>Download <em>{{ title }}</em></h1>
<p>Thanks for purchasing <em>{{ title }}</em>! You can download it here:</p>
<p><a target="_blank" class="btn btn-lg btn-success" href="{{ url }}">Download Now</a></p>
<p>And afterwards, be sure to check out...</p>
</div>
</div>

Здесь сложная часть: внизу страницы download.html, я хочу иметь тег включения, который динамически заполняется на основе страницы, указанной в параметре "upsell" - что-то вроде этих строк:

download.html Часть 2

{% upsell %}

Затем я хочу, чтобы этот тег динамически вытаскивал из моего файла base_extras.py в зависимости от указанной страницы "upsell":

base_extras.py

@register.inclusion_tag('base/pages/upsell-1.html')
def upsell_1_content():
return

@register.inclusion_tag('base/pages/upsell-2.html')
def upsell_2_content():
return

Таким образом, если указан "upsell-1", используется шаблон "upsell-1.html"; если указано "upsell-2", подан шаблон "upsell-2.html".

Однако, когда я делаю выше, я получаю TemplateError. Есть ли простой способ подавать шаблон динамически, как то, что я пытаюсь сделать выше?

спросил(а) 2016-11-09T02:20:00+03:00 3 года, 11 месяцев назад
1
Решение
106

Догадаться! Чтобы решить эту проблему, я полностью отключал теги включения и использовал тег vanilla {% include%}, который напрямую втягивает содержимое внешнего шаблона и передает его в контексте текущего шаблона.

Теперь мой код выглядит так: urls.py и views.py, выше, остаются неизменными. В base_extras.py кода не требуется. Изменено только скачивание.html:

download.html

<div id="thank-you-content">
<div class="wrapper">
<h1>Download <em>{{ title }}</em></h1>
<p>Thanks for purchasing <em>{{ title }}</em>! You can download it here:</p>
<p><a target="_blank" class="btn btn-lg btn-success" href="{{ url }}">Download Now</a></p>
<p>And afterwards, be sure to check out...</p>
</div>
</div>
{% include upsell %}

ответил(а) 2016-11-10T01:24:00+03:00 3 года, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема