【问题标题】:Django Includes - are they evil?Django 包括 - 它们是邪恶的吗?
【发布时间】:2012-01-23 16:36:56
【问题描述】:

我尊敬的一位朋友和开发人员最近建议我避免在 django 模板中使用“包含”。他们的论点总和是包括是“邪恶的”。

我无法理解逻辑;我的新手意见是,它们是组织可重用 html 块的好方法,并且不必在多个位置编辑 html,我可以在必须进行更改时简单地编辑它。

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

【问题讨论】:

  • 如果某人的逻辑总和是“这是邪恶的”,那么这不是逻辑!这对开发人员和宗教人士一样适用:)

标签: django templates include django-templates


【解决方案1】:

这似乎有点奇怪。包含是模板语言中完全有效的部分,从第一天开始就是如此,并且从未推荐或弃用 AFAIK。

你的朋友可能想说你应该更多地依赖模板继承(这是一种相反的包含)。就目前而言,这是正确的——大多数情况下,最好将你的块模板组合成覆盖或扩展父模板中定义的块。但肯定有包含的用例。

他可能会说的唯一其他原因是因为从磁盘加载包含模板时增加了文件系统命中。在这种情况下,他肯定是不合时宜的——同样,推荐的模板继承模型也会有完全相同的命中;并且两者都可以通过使用可选的缓存文件系统加载器来避免。

【讨论】:

    【解决方案2】:

    正如丹尼尔所说,由于他提到的原因,包含是完全有效的。因此,很难给出 Pro's 和 Con's,因为这实际上取决于您要完成的工作。

    通常最好在基本模板的块标签内定义网站的通用元素,并使用模板继承来更改每个页面上所需的部分。但是,如果您只是需要在许多地方重用一个 sn-p 文本,那么“包含”将是完美的。

    需要注意的重要一点是,include 不能包含块标记,因为它们是在不知道父页面的情况下自行呈现的。为了更好地理解这一点,请参阅template docs on includes 或此(非错误)bug report 的注释。如果您发现自己需要此功能,则可能值得考虑是否应该将包含的文件移动到块标记内的基本模板中。

    【讨论】:

      【解决方案3】:

      他可能会说您最好编写自定义标签。所以不要有:

      {% 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 %}
      

      更可重用。使用包含您必须将每个 post1 和 post2 重命名为“post”,然后包含模板...

      【讨论】:

        猜你喜欢
        • 2011-01-04
        • 2011-01-02
        • 1970-01-01
        • 2011-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-18
        相关资源
        最近更新 更多