如何在Django模板中包含图像文件?

93 投票
15 回答
262228 浏览
提问于 2025-04-15 11:47

我刚开始学习Django,想通过一个简单的项目来掌握它。我正在开发一个叫“dubliners”的系统,还有一个叫“book”的应用。我的文件夹结构是这样的:

dubliners/book/  [includes models.py, views.py, etc.]
dubliners/templates/book/

我有一个JPG文件,需要在每个网页的头部显示。请问我应该把这个文件放在哪里?在模板中用哪个路径来显示它呢?我试过很多地方和路径,但到现在为止都没有成功。

感谢下面的回答。不过,我试过相对路径和绝对路径来引用这个图片,但网页上还是显示不出来一个破损的图片图标。例如,如果我在我的主目录里有一张图片,并在我的模板中使用这个标签:

<img src="/home/tony/london.jpg" /> 

但是图片就是不显示。如果我把网页保存为静态HTML文件,图片就能显示,所以路径是对的。也许Django自带的默认网页服务器只会在特定的路径下显示图片?

15 个回答

20

我明白你的问题是关于存储在 MEDIA_ROOT 里的文件,但有时候,如果你不打算再创建那种类型的内容,存放在静态文件里也是可以的。
这可能是个少见的情况,但如果你有大量的“每日图片”要在你的网站上展示,而这些文件都在你的硬盘上呢?

在这种情况下,我觉得把这些内容存放在 STATIC 里是没有问题的。
这样做其实很简单:

静态文件

要链接到保存在 STATIC_ROOT 里的静态文件,Django 提供了一个静态模板标签。无论你是否使用 RequestContext,都可以使用这个标签。

{% load static %} <img src="{% static "images/hi.jpg" %}" alt="Hi!" />

摘自 官方 Django 1.4 文档 / 内置模板标签和过滤器

78

试试这个,

settings.py

# typically, os.path.join(os.path.dirname(__file__), 'media')
MEDIA_ROOT = '<your_path>/media'
MEDIA_URL = '/media/'

urls.py

urlpatterns = patterns('',
               (r'^media/(?P<path>.*)$', 'django.views.static.serve',
                 {'document_root': settings.MEDIA_ROOT}),
              )

.html

<img src="{{ MEDIA_URL }}<sub-dir-under-media-if-any>/<image-name.ext>" />

注意事项

要小心!使用 Context() 会让 {{MEDIA_URL}} 得到一个空值。你必须使用 RequestContext(),否则会出问题。

希望这能帮到你。

52

在实际使用中,你只需要让你的模板生成的HTML指向主机上存储媒体文件的位置。所以你的模板里可能会有这样的内容:

<img src="../media/foo.png">

然后你只需要确保那个目录存在,并且里面有相关的文件。

在开发阶段就有点不同了。Django的文档解释得很简洁明了,直接去看会更有效,而不是在这里重复一遍。基本上,你需要为网站的媒体文件定义一个视图,并且硬编码一个指向磁盘上位置的路径。

具体内容可以在这里找到。

撰写回答