将变量传递到扩展模板?

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 回答很好地总结了extendinclude 功能之间的差异。


编辑

针对您的 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 如何将自定义变量传递给上下文以在自定义管理模板中使用?

如何使用 Django 的模板扩展变量?

如何使用 Django 的模板扩展变量?

Django,如何将变量从 Django 管理员传递到模板?

如何将变量从包含的模板传递到包含它的模板?