Django包含标签未显示数据

2 投票
1 回答
960 浏览
提问于 2025-04-18 01: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 正常工作,简单地在 base.html 中写 {% include 'menu.html' %} 这样可以吗?这样会自动渲染吗?

编辑:根据下面的反馈,以上代码是正确的,但 base.html 的代码有问题,因为包含标签不是用 {% include %} 来加载的,而是用 {% load %}

修正后的 base.html

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

谢谢你的反馈!

1 个回答

2

直接查看menu.html这个模板是看不到任何内容的,因为它没有设置任何上下文变量。gethoods会是空的,所以模板里的循环就没有东西可以循环。

include标签的一个主要作用是设置额外的上下文变量,然后用这些变量来渲染模板。直接查看模板时,会看到没有变量的模板,但如果包含了include模板(在你的情况下是{$ show_hood %}),就会添加上下文变量(gethoods),并用这些变量来渲染模板。

回答你的第二个问题,你可以通过它的名字来添加include模板(默认是函数的名字),而不是使用{% include %}标签。{% include %}标签是用来在一个模板里简单地渲染另一个模板的,通常不需要上下文变量,或者使用父模板中可用的上下文变量。

撰写回答