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

Ton*_*ony 65 python django django-templates

我是Django的新手,我正在尝试通过一个名为'dubliners'的简单项目和一个名为'book'的应用程序来学习它.目录结构如下:

dubliners/book/  [includes models.py, views.py, etc.]
dubliners/templates/book/
Run Code Online (Sandbox Code Playgroud)

我有一个JPG文件需要显示在每个网页的标题中.我应该在哪里存储文件?我应该使用哪条路径让标签使用模板显示它?我尝试过各种各样的地点和路径,但到目前为止还没有任何工作.

...

感谢下面的答案.但是,我已经尝试了图像的相对和绝对路径,并且我仍然在网页中显示一个损坏的图像图标.例如,如果我的主目录中有图像并在我的模板中使用此标记:

<img src="/home/tony/london.jpg" /> 
Run Code Online (Sandbox Code Playgroud)

图像不显示.但是,如果我将网页保存为静态HTML文件,则会显示图像,因此路径正确.也许Django附带的默认Web服务器只有在特定路径上才会显示图像?

小智 66

试试这个,

settings.py

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

urls.py

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

html的

<img src="{{ MEDIA_URL }}<sub-dir-under-media-if-any>/<image-name.ext>" />
Run Code Online (Sandbox Code Playgroud)

警告

谨防!使用Context()将产生一个空值{{MEDIA_URL}}.你必须使用RequestContext().

我希望这个能帮上忙.

  • 对此非常感谢!最后唯一真正帮助我的答案! (2认同)

Jos*_*sad 35

在生产中,您只需从模板生成的HTML指向主机存储媒体文件的位置.所以你的模板就是这样的

<img src="../media/foo.png">
Run Code Online (Sandbox Code Playgroud)

然后你只需要确保该目录与相关文件一起存在.

在开发期间是一个不同的问题.django文档简洁明了地解释了它在链接并在此处键入它更有效,但基本上你将为站点媒体定义一个视图,其中包含硬盘编码的磁盘位置路径.

右键点击这里.

  • 可能更好地使用<img rel="nofollow noreferrer" src ="{{MEDIA_URL}} foo.png />而不是硬编码媒体的位置. (27认同)

And*_*yak 18

我的理解是,您的问题是关于存储在MEDIA_ROOT中的文件,但是当您不打算再创建该类型的内容时,有时可以将内容存储在静态中.
可能这是一个罕见的情况,但无论如何 - 如果你的网站有大量"当天的图片" - 所有这些文件都在你的硬盘上?

在这种情况下,我认为没有反对将这样的内容存储在STATIC中.
一切都变得非常简单:

静态的

链接到STATIC_ROOT中保存的静态文件Django附带静态模板标记.无论您是否使用RequestContext,都可以使用此方法.

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

复制自官方django 1.4文档/内置模板标签和过滤器


小智 11

我花了两天时间研究这个问题,所以我想我也会分享我的解决方案.截至2010年11月26日,当前分支为1.2.X,这意味着您必须在settings.py中拥有以下内容:

MEDIA_ROOT = "<path_to_files>" (i.e. /home/project/django/app/templates/static)
MEDIA_URL = "http://localhost:8000/static/"
Run Code Online (Sandbox Code Playgroud)

*(请记住,MEDIA_ROOT是文件的位置,MEDIA_URL是您在模板中使用的常量.)*

然后在你的url.py中放置以下内容:

import settings

# stuff

(r'^static/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT}),
Run Code Online (Sandbox Code Playgroud)

然后在你的HTML中你可以使用:

<img src="{{ MEDIA_URL }}foo.jpg">
Run Code Online (Sandbox Code Playgroud)

django的工作方式(据我所知):

  1. 在html文件中,它将MEDIA_URL替换为setting.py中的MEDIA_URL路径
  2. 它看起来在url.py找到了MEDIA_URL任何比赛,然后如果发现匹配(如R"?^静态/(P)$"*涉及到的http://本地主机:8000 /静态/),它会搜索对于MEDIA_ROOT中的文件,然后加载它


小智 9

项目根目录下的/ media目录

Settings.py

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
Run Code Online (Sandbox Code Playgroud)

urls.py

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

模板

<img src="{{MEDIA_URL}}/image.png" > 
Run Code Online (Sandbox Code Playgroud)


Fir*_*wer 8

在开发中
在您的app文件夹中创建文件夹名称'static'并将图片保存在该文件夹中.
要使用图片:

<html>
    <head>
       {% load staticfiles %} <!-- Prepare django to load static files -->
    </head>
    <body>
        <img src={% static "image.jpg" %}>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

在生产中:
与开发中的一样相同,只需为Django添加更多参数:

  1. 添加settings.py
    STATIC_ROOT = os.path.join(BASE_DIR, "static/")(这将准备文件夹,其中将存储来自所有应用程序的静态文件)

  2. 确保你的应用程序在 INSTALLED_APPS = ['myapp',]

  3. 在terminall运行命令python manage.py collectstatic(这将使包含在INSTALLED_APPS中的所有应用程序的静态文件复制到全局静态文件夹--STATIC_ROOT文件夹)

    这就是Django需要的所有内容,之后您需要进行一些Web服务器端设置使用静态文件夹的提交.例如,在配置文件httpd.conf(对于windows)或sites-enabled/000-default.conf中的apache2中.(在linux的站点虚拟主机部分下)添加:

    别名\ static"path_to_your_project\static"

    要求所有被授予的

    就是全部


小智 6

如果您的文件是模型中的模型字段,您还可以在模板标记中使用".url"来获取图像.

例如.

如果这是你的型号:

class Foo(models.Model):
    foo = models.TextField()
    bar = models.FileField(upload_to="foo-pictures", blank = True)  
Run Code Online (Sandbox Code Playgroud)

在视图中将模型传递给上下文.

return render (request, "whatever.html", {'foo':Foo.objects.get(pk = 1)})
Run Code Online (Sandbox Code Playgroud)

在您的模板中,您可以:

<img src = "{{foo.bar.url}}">
Run Code Online (Sandbox Code Playgroud)


ken*_*der 5

您的

<img src="/home/tony/london.jpg" />
Run Code Online (Sandbox Code Playgroud)

将用于从磁盘读取的HTML文件,因为它将假定URL file:///home/....对于从网络服务器提供的文件,URL将变为:http://www.yourdomain.com/home/tony/london.jpg,这可能是无效的URL而不是您的真实含义.

有关如何提供服务以及放置静态文件的位置,请查看此文档.基本上,如果您正在使用django的开发服务器,您希望向他显示您的媒体文件所在的位置,然后将您的urls.py服务提供给那些文件(例如,使用一些/static/网址前缀).

将要求你在你的东西中放置这样的东西urls.py:

(r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
    {'document_root': '/path/to/media'}),
Run Code Online (Sandbox Code Playgroud)

在生产环境中,您希望跳过此操作并使您的http服务器(apache,lighttpd等)提供静态文件.