我试图使用
包含.html{% include "paintings/experiments/points/{{substance.name}}.html" %}
然而,这会导致错误TemplateDoesNotExist
。
如果我对.html文件的名称进行硬编码,它确实有用。
{% include "paintings/experiments/points/fabric.html" %}
事实上,我可以在包含的html中使用{{substance.name}}
,它确实可以替代fabric
。为什么在使用include标签时我不能使用django变量?
答案 0 :(得分:0)
include
模板标记旨在接受字符串或变量。如果你试图使用上面的内容,那就是字符串。但您可以使用模板过滤器和标签来操作字符串。
您可以创建创建变量的自定义模板标记,然后在include
标记中使用新创建的变量。如果您查看Custom template tags and filter上的文档,您将了解它们的工作原理以及它们的工作要求。
首先,您必须在名为templatetags
myapp/
__init__.py
models.py
templatetags/
__init__.py
custom_tags.py
views.py
下面是为模板路径创建变量的可能代码:
from django import template
register = template.Library()
@register.simple_tag
def build_template_path(base, name):
return base.format(name)
您的案例中的{p> base
为"paintings/experiments/points/{}.html"
,name
为source.name
。
现在,在模板中,首先必须使用以下命令加载这些自定义标记:
{% load custom_tags %}
然后在模板中使用此模板标记:
{% for source in sources %}
{% build_template_path "paintings/experiments/points/{}.html" source.name as template_path %}
{% include template_path %}
{% endfor %}
使用build_template_path
,您可以创建自定义变量template_path
,然后在include
标记中使用该变量。
总的来说,模板标签非常强大。您可以使用它们创建或执行任何操作,而过滤器则有限,但您也可以使用过滤器完成此操作。也许是这样的:
@register.filter
def replace_value(value, name):
return value.replace('**', name)
{% include "paintings/experiments/points/**.html"|replace_value:source.name %}