我有一个名为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'
答案 0 :(得分:0)
在您的子模板中,将其添加到顶部
{% extends 'base.html' %}
这将允许您“继承”上下文变量。
或者,如果您只想将user
数据传递给模板,则可以在base.html
中进行以下操作
{% include 'header.html' with my_user=user %}
This的答案很好地总结了extend
和include
功能之间的区别。
修改:
响应您的评论和更新的问题,您没有正确访问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>