14

Django 的内置包含标签自定义包含标签有什么区别?

我已经阅读了文档,两者似乎都实现了相同的目标:渲染一个模板,并将其传递给上下文或变量。

4

4 回答 4

18

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

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

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

尽管您在某种意义上是正确的,即简单地传递未经处理的上下文的自定义包含标签将与include标签相同。

于 2013-01-08T15:57:24.450 回答
9

需要将模板分成更小的文件?使用包含标签(为了可读性和可维护性以及 DRY)

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

于 2013-01-08T17:21:46.157 回答
2

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

使用默认模板加载器时,两者绝对没有区别。两者最终都会调用该InclusionTag render()函数,该函数又会调用Loader get_contents()从文件系统打开模板文件的模板。render()仅在文件用于循环模板的情况下缓存文件。

附带说明一下,使用django.template.loaders.cached.Loader可能会产生性能差异。

最后,关于 dgel 建议在不同视图中使用包含标记作为通用上下文:当 html 标记位于跨多个视图的单个基本模板中时,很有可能避免渲染包含模板的额外开销,通过使用ContextMixin。这是一个非常常见的渲染场景,例如。基本模板中的主菜单。

于 2017-03-04T08:11:41.377 回答
0

就在我最近遇到了这个问题,因为我试图找到最好的路线 -includeinclusion tag- 当没有真正的额外逻辑可能进入inclusion tag.

我选择了inclusion tag以下原因:

  1. 模板中更紧凑和可读的标记
    <!-- include -->
    {% include "path/to/funky.html" with arg1=arg1 arg2=arg2 %}
    
    对比
    <!-- inclusion tag -->
    {% funky arg1 arg2 %}
    
  2. 更易于维护代码,如果您必须向标签添加自定义逻辑,那么添加很容易
  3. 它强制您使用范围正确的模板变量,因此inclusion tag不能从父视图继承变量,使其对奇怪的错误更具弹性
于 2020-10-01T05:22:17.370 回答