【问题标题】:django: how to include a static file in a template?django:如何在模板中包含静态文件?
【发布时间】:2023-03-29 19:09:02
【问题描述】:

在 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这两个模板标签,这样我就可以包含一个静态文件了?
  • Is showing effort needed? -> " "工单" ...应该被标记为"太宽泛"。"
  • 在模板中包含静态文件并不是一件很常见的事情;您确定这确实是您要解决的任何问题的正确解决方案吗?有一些变通方法,例如将您的 STATIC_ROOT 包含在 TEMPLATE_DIRS 中,甚至为静态文件编写自己的模板加载器,但这是一件很奇怪的事情,而且它可能会在以后再次咬你。
  • 在这种情况下,您并不需要一个静态文件,而是一个常规模板。
  • +1,我遇到了类似的问题。您为什么要这样做的一个示例:在 HTML 中包含 SVG 以启用 CSS 样式。

标签: django templates include


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我有几个想法。

    最简单的做法是确保您启用了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,即您不知道如何在模板中包含静态文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      相关资源
      最近更新 更多