【问题标题】:Why is {% load static %} a dependency for {% get_media_prefix %}?为什么 {% load static %} 是 {% get_media_prefix %} 的依赖项?
【发布时间】:2018-01-21 05:59:28
【问题描述】:

我已经使用{% get_media_prefix %} 很长时间了。当他指出这一点时,我正在向某人解释这一点。

为什么我需要声明{% load static %} 才能使用它?

它甚至在文档的示例代码中使用here

在某种程度上,我理解静态文件和媒体文件在本质上是相似的。即使我们将它们与 nginx+gunicorn 结合使用,nginx 也会同时处理它们(我们让其他一切代理,但不让这些代理)。

但是我们仍然为这些文件定义了单独的MEDIA_URLSTATIC_URL 以及MEDIA_ROOTSTATIC_ROOT

那么为什么需要声明 {% load static %} 才能使用 {% get_media_prefix %}

提前致谢。

【问题讨论】:

    标签: django django-staticfiles django-media


    【解决方案1】:

    要在 HTML 中使用模板标签,您必须首先 load 包含它的模块。

    所以,根据source code of get_media_prefix template tag,这个模板标签存在于django/templatetags/static.py中。

    这就是为什么每次在每个 HTML 模板中使用它时都必须 load 的原因。

    这当然适用于每个模板标签的使用。在每个 HTML 文件的顶部加载模板标签,然后使用它们。就像你 import 你的 python 代码中的一个函数。

    更新:来自Django 1.3 release notes

    在以前的 Django 版本中,通常将静态资产与用户上传的文件一起放在 MEDIA_ROOT 中,并在 MEDIA_URL 中提供它们。引入 staticfiles 应用程序的部分目的是更容易将静态文件与用户上传的文件分开。静态资源现在应该放在您的应用程序的static/ 子目录或STATICFILES_DIRS 中列出的其他静态资源目录中,并将在STATIC_URL 中提供。

    如您所见,Django 过去对静态和媒体的处理方式相同。自 Django 1.3 以来,这发生了变化,但模板标签没有。没什么大不了。这只是一个约定。

    【讨论】:

    • 是的。绝对地。我知道因为它保存在那个模块中,所以我需要加载它。这是一个依赖。但是是否有一个特定的原因,因为在“django/templatetags/static.py”中保留了一个包含“媒体前缀”的标签?显然 django 区分了媒体文件和静态文件。那为什么 static.py 模块中保存了一些与媒体文件相关的东西呢?
    • 我也知道这样做可能是为了带来更多的统一性或其他东西。但我只是想知道是否有特定的理由这样做。把它放在一个描述得不是最好的模块中。
    • 现在我明白你的意思了。您的问题的直接答案是我不知道。这实际上是一个实施/决策的原因。是的,Django 确实区分了静态文件和媒体文件,但是仔细查看文档 (Managing static files (e.g. images, JavaScript, CSS)),Django 将它们都包含在同一个文档文件中。您可以随时贡献(通过打开票证)建议此模板标签在django/templatetags/media.py 下使用,然后您必须输入{% load media %}
    • 没错。尽管存在于“媒体”或“静态”中的文件类型在很大程度上是相似的,但 django 归根结底确实区分了两者。这让存在略显奇特。也许作者想到了什么。无论如何,非常感谢您的帮助。
    • 我已经更新了我的答案,以向您指出 staticfiles 应用程序的介绍。但是,由于您在原始问题中提出的问题已得到解答,请将答案标记为正确或让它在空白中流动...... :)
    猜你喜欢
    • 2020-04-06
    • 1970-01-01
    • 2014-08-05
    • 2015-04-13
    • 2018-02-08
    • 2019-05-19
    • 2013-01-20
    • 1970-01-01
    相关资源
    最近更新 更多