如何使用Django的" include tags"来根据提供给View的参数提取动态模板?
我正在为我的网站上的内容创建一个"下载"页面。可以下载许多不同的内容,我想只使用一个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第一部分
来自这个视图的信息将被管道传输到下载模板中,如下所示:
<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第二部分
{% 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。是否有一种简单的方法来动态地提供一个模板,就像我上面所做的那样?
明白了!为了解决这个问题,我完全抛弃了包含标签,使用了普通的{% 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 %}