【问题标题】: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'

【问题讨论】:

    标签: python django django-templates jinja2


    【解决方案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 中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    相关资源
    最近更新 更多