Django:频繁使用包含模板标签 - 多少才算太多?

Posted

技术标签:

【中文标题】Django:频繁使用包含模板标签 - 多少才算太多?【英文标题】:Django: Frequent use of include template tag - how much is too much? 【发布时间】:2019-06-03 05:03:23 【问题描述】:

我注意到我开始大量使用include 模板。我的一个模板文件有 20 多个包含标签。

其中一些用于模式对话框,而这些对话框又包含不同的表单字段集。我也使用具有不同数据属性的基本相同的按钮,所以这些也是使用include 标签完成的。我与 include 一起使用的一些“片段”只有大约五行 html 代码。

我担心这是否太多并且会对性能产生负面影响(因为 Django 会加载其他文件等)

例如,whis 是我与 include 一起使用的 HTML 片段之一的标记:

<div class="form-group">
    <input type="url" class="form-control" id="video-link-input" name="video_link"
           placeholder="YouTube link">
</div>

<input type="hidden" id="video_id" name="video_id" value="">

<img class="img-fluid img-thumbnail"  id="video-img-preview">

希望问题不要太宽泛。我只是想避免可能的不良做法。

【问题讨论】:

【参考方案1】:

过度碎片化的模板会影响你的性能,但不是因为 Django 加载文件。

默认设置下,Django在DEBUG=False时缓存模板文件:

django.template.loaders.cached.Loader

...

如果没有OPTIONS['loaders'],这个加载器会自动启用 指定且 OPTIONS['debug'] 为 False(后一个选项默认为 DEBUG) 的值。

恕我直言,包含很多内容本身并不是一个坏习惯。另一种方法是重复代码,这违反了 DRY 原则。

如果您发现自己在一个模板中多次包含同一个模板,您可能需要考虑使用custom inclusion tag。

如果您真的担心性能,请查看缓存,特别是模板片段缓存。

【讨论】:

我想使用 include 来分隔我的代码部分,因为我的代码看起来太复杂了。出于这个原因使用包含是否不好?【参考方案2】:

根据 Django documentation:

使用 % block % 比使用 % include % 更快 高度碎片化的模板,由许多小块组装而成,可以 影响性能

您可以使用 extendsblock

几个例子: 在base.html 我使用这些块

...
% block navbar %
% endblock %

% block sidebar %
% endblock %

% block searchbar %
% endblock %

% block content %
% endblock %

% block footer %
% endblock %
...

现在我将base.html 扩展为login.html。说我的login.html 只需要navbarcontentfooter

% extends 'base.html' %
<h1>Login </h1>
% block navbar %
   This is my navbar
% endblock %

% block content %
  Here is my login form
% endblock %

% block footer %
  This is footer
% endblock %

现在我将base.html 扩展为home.html。说我的home.html需要navbarsidebarsearchbarcontentfooter

% extends 'base.html' %
<h1>Home page </h1>
% block navbar %
   This is my navbar
% endblock %

% block sidebar %
    This is sidebar
% endblock %

% block searchbar %
% endblock %

% block content %
   This is homepage contents. This will not render which you use in login.html **content** block
% endblock %

% block footer %
% endblock %

【讨论】:

是的,我将这些标签用于更大的 HTML。例如,我有带有基本标记、样式、JS 的 base.html,然后将其用作我更具体的模板的基础。

以上是关于Django:频繁使用包含模板标签 - 多少才算太多?的主要内容,如果未能解决你的问题,请参考以下文章

编舞跳帧!多少算太多?

如何使用“include”标签在 Django 中动态包含模板

处理 django 包含模板标签中的请求

如何告诉 Django 模板不要解析包含看起来像模板标签的代码的块?

带有 jQ​​uery 的 Django 模板“包含”标签

这个 Django 模板标签是啥?