2014-04-04 134 views
1

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

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文件代码是不正确的使用inclusion_tag未装载有{%包括%}但{% load %}代替。

修正base.html文件

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

感谢您的反馈!

+0

你如何在base.html中添加包含标签?另外,什么是HoodList? –

+0

HoodList只是该请求的名称,我应该将其重命名为“请求”吗?根据我计划使用{%include%}标记的base.html。 – WayBehind

+1

使用名称添加包含标签。因此,在base.html中添加{%show_hoods%}应该使用Hood对象列表来呈现menu.html。直接查看menu.html会显示为空,因为menu.html需要show_hoods中传入的上下文变量(gethoods)。 –

回答

1

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

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

回答第二个问题时,您使用名称(默认情况下的功能名称)而不是{% include %}标签添加包含模板。 {% include %}标记适用于当您只需将一个模板渲染到另一个模板内,以及它不需要任何上下文变量或使用可用于其父模板的上下文变量的情况。

+0

感谢您的详细信息。 Django对我来说是新手,在过去的10多年里,我一直在使用应用程序,在那里编写代码,查询并将渲染模板直接包含到模板中。 :) – WayBehind