【问题标题】:Django: cannot pass variable to included template?Django:不能将变量传递给包含的模板?
【发布时间】:2011-05-30 19:57:27
【问题描述】:

我遇到了一个问题,我想在 Django 中使用模板。

这是一个真实的例子: 我有 3 个文件:

  • home.html(将获取从 Views 传递的上下文变量)
  • base.html(骨架模板文件)
  • header.html(包含在 base.html 中)。

如果我将下面的代码直接放在 base.html 中而不包括 header.html,则 {{title}} 变量从home 被正确调用。但是如果我在 base.html 中包含 header.html,则无法调用 {{title}} 变量的值。

<title>{% block title %}{% endblock %} | {{ SITE_INFO_TITLE }}</title>

这个问题有什么解决办法吗?谢谢。

【问题讨论】:

  • 以我理解问题的方式为我工作。您能给出导致问题的三个模板的最小示例吗?
  • 示例如下:base.html 包含使用 {% include "header.html" %} 的 header.htmlheader.html 包含上面的代码 {% block title %}{% endblock %} | {{ SITE_INFO_TITLE }} 用于动态标题生成。 home.html(以及博客和页面的其他模板文件)将通过上下文 (在视图中设置)。
  • 我还是不明白问题出在哪里。为什么模板里是{{ SITE_INFO_TITLE }},渲染上下文里是'title' : 'Welcome...'??
  • {{SITE_INFO_TITLE}} 是我的 Conf 设置中的静态变量(例如公司 XYZ),而“标题”变量将通过视图动态分配。例如。查看标题为“Hello World”的帖子时,整页标题将为:“Hello World |公司 XYZ'

标签: django templates django-templates


【解决方案1】:

你能在{% include %}标签中传入一个变量吗?它记录在这里:https://docs.djangoproject.com/en/1.5/ref/templates/builtins/#include

{% include "name_snippet.html" with person="Jane" greeting="Hello" %}

【讨论】:

    【解决方案2】:

    据我所知,django 中的块和变量是不同的。 如果要将标题作为上下文变量传递,则必须使用 base.html 中的声明来设置它,例如:

    {% include "header.html"%} 
    

    其中又包含:

    {% block title %} {{title}} {%endblock%}
    

    你也可以这样设置在家里。
    {% 块标题 %} 主页 {%endblock%} 但我也尝试在模板上下文中设置。 没有标题栏。

    def test_view(ctx):
      xa = { "title":"Sommaire"}
      return render_to_response("test.html",xa)
    

    我觉得你也可以看到with这个模板标签我觉得可以使用这个标签来设置一个上下文变量。

    【讨论】:

    • 其实把上面的sn -p {% block title %} {{title}} {%endblock%}放在子模板里更有意义。在我的例子中,前面的代码应该依赖于 home.html,所以 {{t​​itle}} 变量将通过上下文设置。我说的对吗?
    • @duy 这取决于你想要什么。实际上我的base.html 模板比叶子模板更复杂,在你的情况下,标题 sn-p 的位置可能在 header.html 中。
    • 是的,你说得对,我也这么认为。问题是当我们将上下文变量传递给包含的模板(子模板)时,它不能被分配。也许这是一个逻辑问题。
    【解决方案3】:

    您可以使用Inclusion Tags 从 Django 模板中呈现附加模板。您还可以从“父”模板传递“子”模板上下文。

    这涉及到您的用例,但它可以解决您的问题。当我循环列表以使用自定义模板呈现每个项目时,我倾向于使用它。如果我需要渲染另一个相同类型的项目,我可以在其他地方重复使用该模板而无需复制标记。

    【讨论】:

    • hum... 如果它确实解决了我的问题,我怀疑包含标签是否可以更具动态性,因此在每个帖子的页面标题不同的博客的情况下,我的页面标题生成不同(post.title 被传递给 {{title}} 变量)?并且包含标签似乎与模型相关联(该标签需要在模型的类中定义)所以如果我想在非模型上下文中使用它(比如主页的标题 - 只涉及一个视图和一个模板)我不不知道能不能帮上忙。顺便说一句,我正在通过您的链接学习包含标签。谢谢。
    猜你喜欢
    • 2020-01-06
    • 2019-04-03
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 2011-08-21
    • 2018-12-03
    • 2020-10-23
    相关资源
    最近更新 更多