Django:经常使用include模板标记-多少太多?

时间:2019-01-08 13:29:58

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

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

其中一些用于模式对话框,而模式对话框又包含用于不同表单字段集的模式对话框。我还使用了基本相同的按钮,但具有不同的数据属性,因此也可以使用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">

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

2 个答案:

答案 0 :(得分:1)

过于分散的模板会影响您的性能,但这并不是因为Django会加载文件。

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

  

django.template.loaders.cached.Loader

     

...

     

如果未安装OPTIONS['loaders'],则会自动启用此加载程序   指定并且OPTIONS['debug']为False(后一个选项默认为   DEBUG的值。)

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

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

如果您真的担心性能,请研究缓存,尤其是模板片段缓存。

答案 1 :(得分:0)

根据Django documentation

  • 使用 {%block%} 比使用 {%include%}
  • 由许多小块组装而成的
  • 重碎片模板可以 影响效果

您可以使用扩展阻止

几个例子: 在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 %}