不能在include标签中使用django变量

时间:2018-01-04 18:02:46

标签: django

我试图使用

包含.html
{% include "paintings/experiments/points/{{substance.name}}.html" %}

然而,这会导致错误TemplateDoesNotExist

如果我对.html文件的名称进行硬编码,它确实有用。

{% include "paintings/experiments/points/fabric.html" %}

事实上,我可以在包含的html中使用{{substance.name}},它确实可以替代fabric。为什么在使用include标签时我不能使用django变量?

1 个答案:

答案 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"namesource.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 %}