【问题标题】:Can't use django variable in include tag不能在包含标签中使用 django 变量
【发布时间】:2018-06-14 12:37:09
【问题描述】:

我正在尝试包含一个 .html 使用

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

然而这会导致错误TemplateDoesNotExist

如果我硬编码 .html 文件的名称,它确实有效。

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

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

【问题讨论】:

  • 因为它不是为了那样使用而设计的。模板名称可以是字符串或变量,不能同时是两者。
  • 查看重复的答案。在您的情况下,您需要使用两次 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 "paintings/experiments/points/"|add:substance.name|add:".htm‌​l" %} 返回UnicodeEncodeError at /mturk/external/task/120/ 'ascii' codec can't encode characters in position 132-133: ordinal not in range(128)。这很奇怪,因为该行甚至没有 133 个字符长。
  • 抱歉,我无法从该错误消息中判断出问题所在。

标签: django


【解决方案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

【讨论】:

    【解决方案2】:

    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)
    

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

    【讨论】:

      猜你喜欢
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 2017-04-06
      • 1970-01-01
      • 2013-04-02
      • 2021-06-02
      相关资源
      最近更新 更多