将变量传递到扩展模板?
Posted
技术标签:
【中文标题】将变量传递到扩展模板?【英文标题】:Passing variables into extends template? 【发布时间】:2019-01-06 05:26:41 【问题描述】:我有一个名为base.html
的模板。顾名思义,它是页眉和页脚所在的位置。在这两个元素之间,是一个% block content %
,子模板可以扩展此模板并在块内容中添加内容。
但是,我希望在标题内部显示用户名。例如, user.username
但当我将此模板扩展到子模板时,Django 似乎无法识别这一点。有没有办法可以将对象传递给扩展模板?这样会显示登录用户的名字吗?
这是我正在尝试做的一个粗略示例。即使用户登录,user.username 也不显示。
base.html
<header>
<h1>Hello, user.username </h1>
</header>
% block content %% endblock %
<footer>
///Some content
</footer>
child.html
% extends 'base.html' %
% block content %
//Some content
% endblock %
views.py for child.html
ChildView(TemplateView):
template_name = 'child.html'
【问题讨论】:
【参考方案1】:在您的子模板中将其添加到顶部
% extends 'base.html' %
这将允许您“继承”上下文变量。
或者,如果您只想将 user
数据传递给模板,您可以在 base.html
中执行以下操作
% include 'header.html' with my_user=user %
This 回答很好地总结了extend
和include
功能之间的差异。
编辑:
针对您的 cmets 和更新的问题,您没有正确访问 user
对象。为此,您必须使用 request.user
。这是因为there is a context processor that passes the user
object to every template。
顺便说一句,如果您要从视图中显式发送user
,则可以像您所做的那样使用 user
访问用户。但是,这显然是完全没有必要的。
【讨论】:
但我想在 base.html 中显示用户的用户名。我怎么做?子模板与 User 模型没有任何关系,只有 base.html @user2896120,将您的代码添加到原始帖子中,以便我更好地理解 嗯,所以我把这个写对了,如果我们想在标题中显示来自模型的东西(不是用户,而是像 Post 这样的东西,我们得到的帖子标题最多视图)我们将在哪里进行此查询以使其显示在 base.html 中,以便所有扩展 base.html 的页面都具有具有最多视图的帖子标题? 正如我的回答所暗示的那样,request
对象以及其他几个核心 django 对象是通过上下文处理器传递的 - 您无需显式调用它们即可在模板中访问它们。如果它是您的 django 应用程序自定义的,您需要在视图中传递它。例如best_post = get_best_post()
所以每次我有一个新视图时,我都必须进行查询并将其传递给视图,以便 base.html 可以在我的 Django 应用程序自定义时使用它?【参考方案2】:
这是因为子模板中blocks
中的内容被覆盖了。
base.html
% block my_block %
This content is overriden by child templates
% endblock my_block %
child.html
% extends 'base.html' %
% block my_block %
This content is shown
% endblock my_block %
如果您希望在所有模板中显示某些内容,则不应将其放在块内容中,而应直接放在基本模板中。
base.html
user.username
% block my_block %
This content is overriden by child templates
% endblock my_block %
所以,这一切都取决于您的页面布局是如何完成的。如果标题始终相同,则不应使用块标记。
如果差不多,但细节有变化,用块来改变细节:
标题:
<h1>This doesn't change ever
% block this_changes %
the child themplate will provide the content
% endblock this_changes %</h1>
<b>User: user.username </b>
【讨论】:
我无法让 user.username 显示在 base.html 中以上是关于将变量传递到扩展模板?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Laravel5 中的刀片模板传递扩展主模板中的变量?
Django 如何将自定义变量传递给上下文以在自定义管理模板中使用?