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.html。 header.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,所以 title 变量将通过上下文设置。我说的对吗? @duy 这取决于你想要什么。实际上我的base.html
模板比叶子模板更复杂,在你的情况下,标题 sn-p 的位置可能在 header.html 中。
是的,你说得对,我也这么认为。问题是当我们将上下文变量传递给包含的模板(子模板)时,它不能被分配。也许这是一个逻辑问题。【参考方案3】:
您可以使用Inclusion Tags 从 Django 模板中呈现附加模板。您还可以从“父”模板传递“子”模板上下文。
这涉及到您的用例,但它可以解决您的问题。当我循环列表以使用自定义模板呈现每个项目时,我倾向于使用它。如果我需要渲染另一个相同类型的项目,我可以在其他地方重复使用该模板而无需复制标记。
【讨论】:
hum... 如果它确实解决了我的问题,我怀疑包含标签是否可以更具动态性,因此在每个帖子的页面标题不同的博客的情况下,我的页面标题生成不同(post.title 被传递给 title 变量)?并且包含标签似乎与模型相关联(该标签需要在模型的类中定义)所以如果我想在非模型上下文中使用它(比如主页的标题 - 只涉及一个视图和一个模板)我不不知道能不能帮上忙。顺便说一句,我正在通过您的链接学习包含标签。谢谢。以上是关于Django:不能将变量传递给包含的模板?的主要内容,如果未能解决你的问题,请参考以下文章