将变量传递到扩展模板中?

时间:2018-07-30 01:12:23

标签: python django django-templates jinja2

我有一个名为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'

2 个答案:

答案 0 :(得分:0)

在您的子模板中,将其添加到顶部

{% extends 'base.html' %}

这将允许您“继承”上下文变量。

或者,如果您只想将user数据传递给模板,则可以在base.html中进行以下操作

{% include 'header.html' with my_user=user %}

This的答案很好地总结了extendinclude功能之间的区别。


修改

响应您的评论和更新的问题,您没有正确访问user对象。为此,您必须使用{{ request.user }}。这是因为there is a context processor that passes the user object to every template

顺便说一句,如果要从视图中显式发送user,则可以按照完成的操作使用{{ user }}访问用户。但是,这显然是不必要的。

答案 1 :(得分:0)

这是因为子模板中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 %}

因此,这全都取决于页面布局的完成方式。如果标题始终相同,则不应使用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>