2013-01-08 143 views

回答

11

他们服务于不同的目的。 include标记仅包含来自现有模板的完整内容和未修改的内容。自定义包含标记将上下文传递给一个函数,该函数可以包含逻辑,以便在将上下文传递给模板之前对其进行处理。

例如,也许我有一个面板,将显示在多个页面上。面板的模板需要通过上下文将一些特定的查询传递给它。包含该面板的页面不需要其他任何上下文变量。如果我使用include标签包含面板模板,那么我必须在包含面板的每个视图中编写这些查询,并将它们作为上下文变量传递。

或者,我可以编写一个包含查询的自定义包含标记并将它们传递给面板的模板。通过使用自定义包含标签,我不需要重复代码以在包含面板的每个视图中生成其上下文。我的视图将包含更少的代码,并且不会被仅由面板使用的上下文变量混乱。

虽然您的意思是,简单地通过未处理的上下文的自定义包含标记与include标记相同。

+0

优秀点。我想知道他们如何比较性能。 – Wtower

4

需要将模板分离为较小的文件?使用包括标签(用于可读性和可维护性以及DRY)

需要在呈现模板之前包含更多代码?使用包含标签(获取更多的数据,添加一些业务逻辑..它真的像另一个小的无网址视图,它就像一个模板函数)。

0

原则上,dgel和YardenST的答案提出的观点是正确的。另外,查看django的代码可以很好地了解这两个选项在性能上的比较。

使用default template loaders时,两者绝对没有区别。两者最终拨打InclusionTagrender()函数,然后调用模板Loaderget_contents()从文件系统打开模板文件。 render()只有在用于循环模板的情况下才缓存该文件。

请注意,使用django.template.loaders.cached.Loader时可能会出现性能差异。

最后,关于dgel建议在不同视图之间使用包含标记来实现公共上下文:当html标记位于跨越单个基本模板时,很有可能避免渲染包含模板的小额外开销在许多意见中,通过使用ContextMixin。这是渲染例如相当常见的情况。基本模板中的主菜单。