无法在include标签中使用Django变量

3
我正在尝试使用代码将一个 .html 文件包含进来。
{% include "paintings/experiments/points/{{substance.name}}.html" %}

这会导致错误TemplateDoesNotExist
如果我硬编码.html文件的名称,它确实可以工作。
{% include "paintings/experiments/points/fabric.html" %}

实际上,我可以在包含的html中使用{{substance.name}},它确实会被替换为fabric。但是为什么我在使用include标签时不能使用Django变量呢?


2
请参考重复的答案。在您的情况下,您需要两次使用add:过滤器,例如"paintings/experiments/points/"|add:substance.name|add:".html"。如果您在视图中设置include_template_name = "paintings/experiments/points/%s.html" % substance.name,然后在模板中使用{% include include_template_name %},您可能会发现代码更加清晰。 - Alasdair
@Alasdair 谢谢。我特别在寻找include标签,现在我明白为什么我找不到任何东西了。 - Mitchell van Zuylen
@Alasdair 发现你的评论中在“.htm‌​l”之间有一个不可见的非ASCII字符,位于m和l之间。 - Mitchell van Zuylen
我已经得到了一个使用自定义模板标签的答案,但是这个问题已经关闭了。由于include标签接受变量,您可以在模板中使用自定义模板标签创建变量,然后在include中使用这个新创建的变量。例如:build_template_path(base, name): return base.format(name),在模板中使用{% build_template_path 'paintings/experiments/points/{}.html' substance.name as template_path %},然后使用{% include template_path %} - Borut
很奇怪,不知道为什么非间断空格会出现。不幸的是,我不能编辑它,因为评论已经超过5分钟了。 - Alasdair
显示剩余3条评论
2个回答

1
我会用add模板标签来实现它。
{% include "paintings/experiments/points/"|add:substance.name %}

请注意,substance.name 应该带有 .html 后缀。我使用这种方法来使用动态模板。因此,在 context_processor 中设置变量值并正常使用它,如下所示:
{% include ""|add:paginationTemplatePath with page=page_obj %}

在这种情况下,我会根据context_processor上的特定条件更改paginationTemplatePath。我提供这个例子是为了丰富其他情况的答案,比如使用带有变量page的include。

1
The include 模板标签旨在接受字符串或变量。如果您尝试使用上述内容,它只会成为字符串。但是,您可以使用模板过滤器和标签来操作字符串。
您可以创建自定义模板标签,创建变量,然后在 include 标签中使用新创建的变量。如果您查看 自定义模板标签和过滤器 的文档,您将了解它们的工作方式以及它们工作所需的要求。
首先,您必须在应用程序中创建一个名为 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)

在您的情况下,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 %}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接