Django:不能将变量传递给包含的模板?

Posted

技术标签:

【中文标题】Django:不能将变量传递给包含的模板?【英文标题】:Django: cannot pass variable to included template? 【发布时间】: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' 【参考方案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 变量)?并且包含标签似乎与模型相关联(该标签需要在模型的类中定义)所以如果我想在非模型上下文中使用它(比如主页的标题 - 只涉及一个视图和一个模板)我不不知道能不能帮上忙。顺便说一句,我正在通过您的链接学习包含标签。谢谢。

以上是关于Django:不能将变量传递给包含的模板?的主要内容,如果未能解决你的问题,请参考以下文章

Django将变量传递给模板

如何将javascript变量传递给django模板标签

在django中将动态变量从父模板传递给子模板

有没有办法将变量传递给 Django 中的“扩展”模板?

将 django 模板变量传递给 js 数据表

django:如何将模板变量传递给 javascript onclick 例程?