我想在我的模板中做这样的事情。
{% include "blogs/blogXYZ.html" %}
XYZ部分应该是可变的。即如何将上下文变量传递给此位置。例如,如果我正在阅读第一篇博客,我应该能够包含blog1.html。如果我正在阅读第二篇博客,我应该能够包括blog2.html等。 django有可能吗?
答案 0 :(得分:2)
您可以编写custom tag来接受变量以在运行时构建模板名称。
以下方法利用string.format
函数构建动态模板名称,当您需要传递两个以上的变量来格式化模板名称时,它可能会遇到一些问题,因此您可能需要修改和自定义以下代码可满足您的要求。
<强> your_app_dir / templatetags / custom_tags.py 强>
from django import template
from django.template.loader_tags import do_include
from django.template.base import TemplateSyntaxError, Token
register = template.Library()
@register.tag('xinclude')
def xinclude(parser, token):
'''
{% xinclude "blogs/blog{}.html/" "123" %}
'''
bits = token.split_contents()
if len(bits) < 3:
raise TemplateSyntaxError(
"%r tag takes at least two argument: the name of the template to "
"be included, and the variable" % bits[0]
)
template = bits[1].format(bits[2])
# replace with new template
bits[1] = template
# remove variable
bits.pop(2)
# build a new content with the new template name
new_content = ' '.join(bits)
# build a new token,
new_token = Token(token.token_type, new_content)
# and pass it to the build-in include tag
return do_include(parser, new_token) # <- this is the origin `include` tag
模板中的用法:
<!-- load your custom tags -->
{% load custom_tags %}
<!-- Include blogs/blog123.html -->
{% xinclude "blogs/blog{}.html" 123 %}
<!-- Include blogs/blog456.html -->
{% xinclude "blogs/blog{}.html" 456 %}