Django中模板包含和静态包含的区别是什么?

时间:2016-06-18 15:19:56

标签: python django

我现在正试图学习Django,并试图确保我没有做任何愚蠢的事情。

我正在使我的网页更加模块化,因为我正在删除模板中的硬编码值(base .html)。这样做,我试图将硬编码的CDN引用(jquery,bootstrap等)转换为可以包含在每个网页中的模块化部分。这样做将允许我将来更改单个文件,而不是被迫转到每个网页并进行更改。

但是,我有点困惑。我试图确定将它们复制到html文件中是否有意义,并使用Django的{% include '' %}模板标记直接包含cdn部分,或者如果使用Django的静态包括会更合适。

那究竟什么是最佳路线?似乎很容易使用模板包含一切静态的所有诚实。为什么不用它来包含javascript或css?

1 个答案:

答案 0 :(得分:1)

  

网站通常需要提供其他文件,例如图片,JavaScript或CSS。在Django中,我们将这些文件称为“静态文件”。

我们称他们为静态'仅仅因为它们不是动态的,即这些文件的内容是相对固定的,无论是设计还是它的内在特征(例如:二进制内容,如图像),因此不需要我们的应用服务器处理

我们将它们与其他文件区分开来,因为建议在较低级别提供这些静态文件,例如,使用nginx。这使我们可以更快地提供这些文件,从而提高性能。它还允许轻松缓存。

但是在使用CDN时,您可以将此工作从服务器卸载到其他人的服务器上。

现在回到你的问题。您不必在每个模板中声明您的资源。通常,<html> <head> <meta charset="utf-8"> <link rel="stylesheet" href="~~CDN HERE~~"> <script src="~~CDN HERE~~"></script> </head> <body> {% block body %}{% endblock %} </body> </html> 包含页面的基础,然后我可以通过更具体的(子)模板扩展(阅读:template inheritance)。

为了快速理解这一点,以下是一个例子:

base.html文件:

{% extends "app/base.html" %}
{% load static %}
{% block body %}
<h1>{{ page_title }}</h1>
<img src="{% static 'app/img/detective.png' %}" alt="detective" />
    {{ page_content | safe }}
{% endblock %}

article.html

{% block css %}{% endblock %}

现在,对于您网站上的每篇文章,您都会呈现自动扩展基础的文章模板,无需为多个页面提及您的css / js文件。

如果您为不同的网页使用不同的资源文件,则可以创建一个额外的块,例如article.html

然后将其添加到您的{% block css %} <link rel="stylesheet" href="{% static 'app/css/article.css' %}"> {% endblock %}

include

注意我是如何使用静态图像的,这是由nginx直接提供的。

理论上,你可以将你的CDN链接发送到一个文件中,然后在base.htmlperl -ane 'print unless $F[2] eq $F[3] and $F[7] eq "inf"' data.txt ,但这只会带来模块化,导致冗余的复杂性。

如果您有任何问题,请与我们联系!