Django的built-in include tag和custom inclusion tags之间有什么区别?
我已经阅读了文档,两者似乎都达到了相同的目标:渲染模板,将模板传递给上下文或变量。
答案 0 :(得分:12)
它们用于不同的目的。 include
标记仅包含现有模板中的内容并且未经修改。自定义包含标记将上下文传递给一个函数,该函数可以包含在将上下文传递给模板之前操作上下文的逻辑。
例如,也许我有一个将在多个页面上显示的面板。面板的模板需要通过上下文将一些特定查询传递给它。包含面板的页面不需要其他任何上下文变量。如果我使用include
标记包含面板模板,我将不得不在包含面板的每个视图中编写这些查询,并将它们作为上下文变量传递。
或者,我可以编写一个包含查询的自定义包含标记,并将它们传递给面板的模板。通过使用自定义包含标记,我不需要重复代码来在包含面板的每个视图中生成其上下文。我的观点将包含更少的代码,并且不会仅仅由面板使用的上下文变量混乱。
虽然您是正确的,因为简单地传递未经操作的上下文的自定义包含标记与include
标记相同。
答案 1 :(得分:5)
需要将模板分隔为较小的文件吗?使用包含标记(可读性和可维护性以及DRY)
在渲染模板之前需要包含更多代码吗?使用包含标记(获取更多数据,添加一些业务逻辑......它真的像另一个小的无网址视图。它就像一个模板函数。)
答案 2 :(得分:0)
原则上,dgel和YardenST的回答是正确的。另外,查看django的代码可以很好地了解这两个选项在性能方面的比较。
使用default template loaders时,两者之间绝对没有区别。两者最终都调用InclusionTag
render()
函数,后者又调用模板Loader
get_contents()
,从文件系统打开模板文件。 render()
仅缓存文件,以防它在模板中用于循环。
作为旁注,使用django.template.loaders.cached.Loader可以实现性能差异。
最后,关于dgel建议在不同视图中使用包含标记用于公共上下文:当html标记位于跨越的单个基本模板中时,很有可能避免渲染包含模板的额外开销许多观点,使用ContextMixin。这是渲染的常见场景,例如。基本模板中的主菜单。
答案 3 :(得分:0)
最近,当我试图找出最适合采用的路线-include
与inclusion tag
时,遇到了这个问题-当inclusion tag
中没有真正的额外逻辑时。
出于以下原因,我选择了inclusion tag
:
<!-- include -->
{% include "path/to/funky.html" with arg1=arg1 arg2=arg2 %}
与
<!-- inclusion tag -->
{% funky arg1 arg2 %}
inclusion tag
不能从父视图继承变量,从而使它对怪异的bug更具弹性