【问题标题】:Django inclusion tag not showing dataDjango包含标签不显示数据
【发布时间】:2014-05-16 03:22:16
【问题描述】:

我正在尝试创建包含标签,以便可以在每个页面的导航栏中显示数据。该标签将包含在“base.html”中,因此它应该显示在任何地方。

tags.py

@register.inclusion_tag('menu.html')
def show_hoods(HoodList):
    gethoods = Hood.objects.all()
    return {'gethoods': gethoods}

menu.html

{% for hood in gethoods %}
<h3>{{ hood.name }}</h3>
{% endfor %}

由于某种原因,menu.html 模板是空白的并且没有显示任何数据。

另外,一旦我运行了 menu.html,简单的 {% include 'menu.html' %} 会在 base.html 中工作吗?那会自动渲染吗?

编辑: 根据下面的反馈,上面的代码是正确的,但是 base.html 代码不正确,因为 contains_tag 没有加载 {% include %} 而是使用了{% load %}

更正了 base.html

{% load tags %}
{% show_hoods hoodlist %}

感谢您的反馈!

【问题讨论】:

  • 如何在 base.html 中添加包含标签?另外,HoodList 是什么?
  • HoodList 只是请求的名称,我应该将其重命名为“请求”吗?根据 base.html,我计划使用 {% include %} 标签。
  • 您使用它们的名称添加包含标签。因此,在 base.html 中添加 {% show_hoods %} 应该会呈现带有 Hood 对象列表的 menu.html。直接查看 menu.html 会将其显示为空,因为 menu.html 需要您在 show_hoods 中传递给它的上下文变量(gethoods)。
  • 只需在 base.html 中执行 {% include menu.html %} 即可包含 menu.html 而无需将 gethoods 上下文变量传递给它。除非渲染 base.html 的视图可以使用 gethoods 上下文变量,否则它也将为空。这就是包含标签的用途 - 设置一些额外的上下文变量使用这些上下文变量呈现模板。
  • 或者,您可以将问题编辑回最初的样子,然后发布您的修复作为答案。这样一来,遇到类似问题的人就可以更轻松地了解解决方案是什么。

标签: python html django


【解决方案1】:

直接查看 menu.html 模板不会显示任何内容,因为它没有设置上下文变量。 gethoods 将为空,因此模板中的 for 循环不会循环任何内容。

包含标签的主要目的之一是设置额外的上下文变量,然后使用这些变量呈现模板。直接查看模板将显示没有变量的模板,但包括包含模板(在您的情况下为{$ show_hood %})将添加上下文变量(gethoods)并使用它们呈现模板。

回答您的第二个问题,您添加包含模板时使用它们的名称(默认为函数名称)而不是 {% include %} 标记。 {% include %} 标签适用于您只想在另一个模板中呈现一个模板,并且它不需要任何上下文变量或使用其父模板可用的上下文变量的情况。

【讨论】:

  • 感谢您提供详细信息。 Django 对我来说是新的,因为在过去的 10 多年里,我一直在使用应用程序编写代码、查询并将渲染的模板直接包含到模板中。 :)
猜你喜欢
  • 2013-08-08
  • 2018-08-05
  • 1970-01-01
  • 2012-08-20
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多