1

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

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

它甚至在此处的文档示例代码中使用。

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

但是我们仍然为这些文件定义了一个单独的MEDIA_URLSTATIC_URL以及MEDIA_ROOT和定义。STATIC_ROOT

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

提前致谢。

4

1 回答 1

1

为了在 HTML 中使用模板标签,您必须首先加载包含它的模块。

所以,根据模板标签的源码get_media_prefix这个模板标签就在里面django/templatetags/static.py

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

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

更新:来自Django 1.3 发行说明

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

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

于 2017-08-13T04:19:16.087 回答