Django包含标签未显示数据
我正在尝试创建一个包含标签,这样我就可以在每个页面的导航栏中显示数据。这个标签会被放在“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 %}
标签是用来在一个模板里简单地渲染另一个模板的,通常不需要上下文变量,或者使用父模板中可用的上下文变量。