django:如何在模板中包含静态文件?

时间:2016-04-13 06:57:30

标签: django templates include

在Django项目中,我想在模板中包含一个静态文件。以下是项目结构:

proj/
   main/
      static/
         main/
            js/
               main.js
   news/
      templates/
        news/
           news.html

news.html中,我希望将main.js包含以下假设的格式:

{% load staticfiles %}
...

{% include {% static 'main/js/main.js' %} %}

我该怎么做?

2 个答案:

答案 0 :(得分:5)

include指令仅搜索模板目录中的文件。您可以做的(虽然我不会)将您的设置更改为包含静态文件:

TEMPLATE_DIRS = [
    ...
    "path/to/your/statics",
]

答案 1 :(得分:1)

我有几个想法。

最简单的方法是确保启用filesystem loader,并在TEMPLATES[0]['DIRS'](之前为TEMPLATE_DIRS)中包含包含静态文件的相关目录。需要注意的是,它不会自动获取已安装应用程序中包含的静态文件,除非您在DIRS中列出它们。另一种选择是使用STATIC_ROOT,但只有在每次更改静态文件时都运行collectstatic,这通常不会在开发过程中发生。另一个缺陷是它只能用于本地静态存储,而不是你使用任何CDN或以其他方式托管不同主机/网络上的静态文件。

您可以做的另一件事是编写自己的模板加载器,它将使用静态文件API将静态加载为模板。这涉及更多,但它应该能够访问静态文件,无论它们如何存储和提供。

如果您选择任一选项,您仍需要小心。例如,您必须确保将您作为模板包含的静态文件安全地包含在HTML或您正在使用它们的任何其他上下文中。将不会进行转义。

如果您正在尝试优化客户端必须提出的请求数量,那么有更好的方法。您最有可能更好地实现一些预处理和缩小静态文件的管道。将任何重要的CSS / JS包含在HTML中将使客户无法利用缓存,迫使他们一遍又一遍地重新下载相同的静态内容,可能会对性能产生负面影响。

编辑:由于您只想包含一些动态JavaScript变量,因此根本不是静态文件。你真正想要的是创建一个包含JavaScript代码的模板,而不是将静态文件作为模板处理。没有规则可以说每个javascript都需要是一个静态文件。如果它是动态的,那么它不是静态文件。

对于记录,这是XY problem的典型实例。问题X在渲染模板时动态地为JavaScript变量赋值。你想出了在模板中包含静态文件作为潜在的解决方案,但后来遇到了问题Y,这就是你不知道如何在模板中包含静态文件。