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

django: how to include a static file in a template?

在 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' %} %}

我该怎么做?

include 指令只搜索模板目录中的文件。你可以做的(虽然我不会)是改变你的设置以包括静态文件:

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

我有几个想法。

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

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

无论选择哪一个,还是要慎重。例如,您必须确保作为模板包含的静态文件可以安全地包含到 HTML 或您正在使用它们的任何其他上下文中。不会有任何转义。

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

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

郑重声明,这是 XY problem 的典型实例。问题 X 在渲染模板时动态地为 JavaScript 变量赋值。您想到了在模板中包含静态文件作为一个潜在的解决方案,但后来遇到了问题 Y,即您不知道如何在模板中包含静态文件。