【问题标题】:Django: Frequent use of include template tag - how much is too much?Django:频繁使用包含模板标签 - 多少才算太多?
【发布时间】: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">

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

【问题讨论】:

    标签: django django-templates django-template-filters


    【解决方案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,然后将其用作我更具体的模板的基础。
    猜你喜欢
    • 2017-01-05
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2012-09-23
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多