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

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

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

我该怎么做?


为什么会有人点踩?并且建议关闭这个问题,因为它“过于宽泛”?这太疯狂了!这个问题非常具体:我如何集成两个模板标签includestatic,以便我可以包含一个静态文件? - Randy Tang
“Is showing effort needed?”(http://meta.stackoverflow.com/q/288176/1324033)-> “‘工作指令’…应被标记为‘过于宽泛’。” - Sayse
1
在模板中包含静态文件并不是一件很常见的事情;你确定这真的是解决你试图解决的任何问题的正确方法吗?有一些变通方法,比如将STATIC_ROOT包含在TEMPLATE_DIRS中,甚至编写自己的静态文件模板加载器,但这是一件奇怪的事情,而且以后可能会给你带来麻烦。 - koniiiik
1
在这种情况下,您实际上不需要一个静态文件,而是一个常规模板。 - koniiiik
1
+1,我也遇到了类似的问题。你想这么做的一个例子是:将SVG包含在HTML中以启用CSS样式。 - Nathan Hinchey
显示剩余2条评论
2个回答

6
< p > include 指令只在模板目录中搜索文件。您可以这样做(尽管我不建议),即更改设置以包括静态文件:

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

0

我有几个想法。

最简单的方法是确保你已经启用了文件系统加载器,并且在TEMPLATES[0]['DIRS'](之前是TEMPLATE_DIRS)中包含包含静态文件的相关目录。需要注意的是,它不会自动捕获安装应用程序中包含的静态文件,除非你也将它们列在DIRS中。另一种选择是使用STATIC_ROOT,但这仅适用于每次更改静态文件时运行collectstatic,在开发中通常不必这样做。另一个问题是它只适用于本地静态存储,如果你使用任何CDN或以其他方式在不同的主机/网络/任何东西上托管你的静态文件,则无法使用。

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

无论您选择哪个选项,都必须小心。例如,您必须确保将作为模板包含的静态文件安全地包含到HTML或其他上下文中。不会发生任何转义。
如果您试图优化客户端必须进行的请求数量,则有更好的方法。您最好实现一些管道来预处理和缩小静态文件。将任何重要的CSS / JS块包含到HTML中将使客户端无法利用缓存,迫使他们一遍又一遍地重新下载相同的静态内容,可能会对性能产生负面影响。
编辑:既然您只想包含一些动态JavaScript变量,那么这根本不是静态文件。您真正想要的是创建一个包含JavaScript代码的模板,并且不要处理静态文件作为模板。没有规则说每个JavaScript都必须是静态文件。如果它是动态的,那么它就不是静态文件。

就记录而言,这是一个典型的XY问题实例。问题X是在渲染模板时动态分配JavaScript变量的值。您提出了在模板中包含静态文件作为潜在解决方案,但随后遇到了问题Y,即您不知道如何在模板中包含静态文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接