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

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

Я создаю страницу "Скачать" для контента на моем сайте. Можно загрузить много разных частей контента, и я хочу использовать только один просмотр для страницы загрузки, который извлекает необязательные параметры из 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. Есть ли простой способ динамически обслуживать шаблон, как то, что я пытаюсь сделать выше?

1 ответ

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

Мой код теперь выглядит следующим образом: urls.py и views.py, выше, остаются без изменений. В base_extras.py код не требуется. Изменен только download.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 %}
Другие вопросы по тегам