Django包含 - 它们是邪恶的吗?

5

我最近得到一个受尊敬的朋友和开发人员的建议,他建议我避免在django模板中使用“Includes”。他的观点是,包含(Includes)是“邪恶的”。

我不太理解这个逻辑。我的初学者看法是,包含(Includes)是组织可重用HTML块的好方法,而且当需要进行更改时,无需在多个位置编辑HTML,只需在一个地方编辑即可。

你们这些天才们怎么看?请提供使用Django模板中包含的一些优缺点。


如果某人的逻辑总结是“这是邪恶的”,那就不是逻辑!这对开发者和宗教信仰者同样适用 :) - Spacedman
3个回答

9
似乎这是一个有些奇怪的观点。包含在模板语言中是完全有效的部分,自从第一天起就是如此,并且从未被推荐或弃用过。
你的朋友可能想说的是你应该更多地依赖模板继承(这有点相反的意思)。这在某种程度上是正确的 - 大多数情况下,最好由块组成模板,这些块覆盖或扩展在父模板中定义的块。但是包含确实有其使用场景。
他可能提出这样的另一个原因是加载包含模板时会增加文件系统访问次数。如果是这样,那么他肯定是错了 - 再一次,建议使用的模板继承模型也会产生完全相同的结果;而且都可以通过使用可选的缓存文件系统加载器来避免。

3
正如Daniel所提到的,包含语句是完全有效的,因为他提到的原因。因此,很难给出利弊分析,因为这实际上取决于你想要达成什么目标。
通常最好在基本模板中将网站的公共元素定义为块标签,并使用模板继承来更换每个页面所需的部分。但是,如果你只需要在许多地方重复使用一小段文本,则“包含语句”是完美的选择。
需要注意的重要一点是,“包含语句”不能包含块标签,因为它们是独立渲染的,没有任何关于父页面的信息。要更好地理解这一点,请参阅模板文档中包含语句的说明或者这个(非错误)bug报告。如果你发现自己需要这种功能,那么值得考虑的是,是否应该将被包含的文件移动到基本模板中的一个块标签中。

2
他可能会建议你编写自定义标签。因此,不要使用以下内容:

原文

{% for post in blog %}
{% include "blog.tmpl" %}
{% endfor %}

你应该做:

{% for post in blog %}
{% formatPost post %}
{% endfor %}

include方法依赖于博客文章存在名为'post'的对象,而自定义标签方法允许您格式化任何内容。例如,如果您有一个比较两篇博客文章的页面,您将在上下文中发送它们作为'post1'和'post2',并执行以下操作:

   <h1>John Said</h1>
   {% formatPost post1 %}
   <h1>And Fred Said</h1>
   {% formatPost post2 %}

更具可重用性。如果使用includes,您需要将post1和post2重命名为“post”,然后再包含模板...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接