Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:内置包含标记与自定义包含标记_Django_Django Templates - Fatal编程技术网

Django:内置包含标记与自定义包含标记

Django:内置包含标记与自定义包含标记,django,django-templates,Django,Django Templates,Django's和Django's的区别是什么 我已经阅读了文档,两者似乎都达到了相同的目标:呈现一个传递上下文或变量的模板。它们有不同的用途。include标记仅包含现有模板中的内容,且未经修改。自定义包含标记将上下文传递给函数,该函数可以包含操作上下文的逻辑,然后再将其传递给模板 例如,我可能有一个面板,它将显示在多个页面上。面板的模板需要通过上下文向其传递一些特定的查询。包含该面板的页面不需要这些上下文变量。如果我使用include标记包含面板模板,我必须在包含面板的每个视图中编写这些查询

Django's和Django's的区别是什么


我已经阅读了文档,两者似乎都达到了相同的目标:呈现一个传递上下文或变量的模板。

它们有不同的用途。
include
标记仅包含现有模板中的内容,且未经修改。自定义包含标记将上下文传递给函数,该函数可以包含操作上下文的逻辑,然后再将其传递给模板

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

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


尽管您的观点是正确的,即仅在未经处理的上下文上传递的自定义包含标记与
include
标记相同。

是否需要将模板分隔为较小的文件?使用包括标签(用于可读性、可维护性和干燥)


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

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

使用时,两者之间绝对没有区别。两者最终都会调用该函数,该函数反过来调用从文件系统打开模板文件的模板
render()
仅在循环模板中使用文件时缓存该文件

作为旁注,通过使用,性能可能会有所不同


最后,关于dgel关于在不同视图的公共上下文中使用inclusion标记的建议:当html标记位于跨多个视图的单个基础模板中时,通过使用。这是一种非常常见的渲染场景,例如基本模板中的主菜单。

最近我遇到了这个问题,当时我正试图找到最好的路线-
include
vs
inclusion tag
,而
inclusion tag
中没有真正的额外逻辑

我选择了
包含标签
,原因如下:

  • 模板中更紧凑、更可读的标记
    <!-- include -->
    {% include "path/to/funky.html" with arg1=arg1 arg2=arg2 %}
    
    
    {%包括带有arg1=arg1 arg2=arg2%的“path/to/funky.html”}
    
    vs
    
    {%funky arg1 arg2%}
    
  • 更容易维护代码,如果必须向标记添加自定义逻辑,那么添加代码也很容易
  • 它强制您使用范围正确的模板变量,因此
    包含标记
    无法从父视图继承变量,使其更能抵御奇怪的错误

  • 您提到使用
    django.template.loaders.cached.Loader
    时可能会出现性能差异。这背后的确切原因是什么?
    <!-- inclusion tag -->
    {% funky arg1 arg2 %}