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

我是Django的新手,我试图通过我正在开发的一个简单的项目“dubliners”和一个名为“book”的应用程序来学习它。 目录结构如下所示:

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

我有一个JPG文件,需要显示在每个网页的标题。 我应该在哪里存储文件? 我应该使用哪个path来使用模板显示标签? 我已经尝试过不同的位置和path,但目前为止没有任何工作。

感谢下面发布的答案。 不过,我已经尝试了图像的相对path和绝对path,而且网页中仍然显示一个破碎的图像图标。 例如,如果我的主目录中有一个图像,并在我的模板中使用这个标签:

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

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

在制作过程中,只需将模板生成的HTML指向主机存储媒体文件的任何位置。 所以你的模板只是举例而已

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

然后你只要确保目录在那里与相关的文件。

在开发过程中是另一个问题。 django文档简洁明了地解释了链接和input在这里的效果,但是基本上你可以定义一个站点媒体的视图,其中硬编码的path位于磁盘上。

在这里 。

尝试这个,

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()

我希望这会有所帮助。

我明白,你的问题是关于文件存储在MEDIA_ROOT,但有时可以存储静态内容,当你不打算再创buildtypes的内容。
可能这是一个罕见的情况,但无论如何 – 如果你有大量的“一天的图片”为您的网站 – 所有这些文件都在你的硬盘上?

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

静态的

链接到保存在STATIC_ROOT中的静态文件Django附带一个静态模板标签。 不pipe你是否使用RequestContext,你都可以使用它。

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

从官方django 1.4文档复制/内置模板标签和filter

我已经花了两天的时间来处理这个问题,所以我只是想分享我的解决scheme。 截至26/11/10,当前分支是1.2.X,所以这意味着你必须在你的settings.py中有以下内容:

 MEDIA_ROOT = "<path_to_files>" (ie /home/project/django/app/templates/static) MEDIA_URL = "http://localhost:8000/static/" 

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

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

 import settings # stuff (r'^static/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT}), 

然后在你的html中,你可以使用:

 <img src="{{ MEDIA_URL }}foo.jpg"> 

Django的工作方式(据我所知,是:

  1. 在html文件中,它使用setting.py中的MEDIA_URLpathreplaceMEDIA_URL
  2. 它在url.py中查找MEDIA_URL的任何匹配,然后如果它发现匹配(如r'^ static /(?P。)$'*与http:// localhost:8000 / static /相关 )为MEDIA_ROOT中的文件,然后加载它

/项目根目录下的媒体目录

Settings.py

 BASE_DIR = os.path.dirname(os.path.dirname(__file__)) MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 

urls.py

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

模板

 <img src="{{MEDIA_URL}}/image.png" > 

你的

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

将适用于从磁盘读取的HTML文件,因为它会假定URL是file:///home/... 对于从networking服务器提供的文件,URL会变成: http://www.yourdomain.com/home/tony/london.jpghttp://www.yourdomain.com/home/tony/london.jpg ,这可能是一个无效的URL,而不是你真正的意思。

有关如何提供服务和放置静态文件的位置,请查看此文档 。 基本上,如果你使用django的开发服务器,你需要向他展示你的媒体文件的位置,然后让你的urls.py提供这些文件(例如,通过使用一些/static/ url前缀)。

将需要你把这样的东西放在你的urls.py

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

在生产环境中,你想跳过这个,使你的http服务器( ApacheLightTpd等)提供静态文件。

如果您的文件是模型中的模型字段,则也可以使用模板标记中的“.url”来获取图像。

例如。

如果这是你的模型:

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

在你的观点中传递模型。

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

在你的模板中你可以有:

 <img src = "{{foo.bar.url}}"> 

另一种方法来做到这一点:

 MEDIA_ROOT = '/home/USER/Projects/REPO/src/PROJECT/APP/static/media/' MEDIA_URL = '/static/media/' 

这将需要您将媒体文件夹移动到静态文件夹的子目录。

然后在您的模板中,您可以使用:

 <img class="scale-with-grid" src="{{object.photo.url}}"/> 

在您的应用程序文件夹中创build文件夹名称“静态”,并将图片保存在该文件夹中。
要使用图片使用:

 <html> <head> {% load staticfiles %} <!-- Prepare django to load static files --> </head> <body> <img src={% static "image.jpg" %}> </body> </html> 

我尝试了各种方法,它没有工作,但这工作。希望它也会为你工作。 文件/目录必须位于以下位置:

projec / your_app / templates项目/ your_app / static

settings.py

 import os PROJECT_DIR = os.path.realpath(os.path.dirname(_____file_____)) STATIC_ROOT = '/your_path/static/' 

例:

 STATIC_ROOT = '/home/project_name/your_app/static/' STATIC_URL = '/static/' STATICFILES_DIRS =( PROJECT_DIR+'/static', ##//don.t forget comma ) TEMPLATE_DIRS = ( PROJECT_DIR+'/templates/', ) 

PROJ /应用/模板/ filename.html

在体内

 {% load staticfiles %} //for image img src="{% static "fb.png" %}" alt="image here" //note that fb.png is at /home/project/app/static/fb.png 

如果fb.png在/home/project/app/static/image/fb.png里面

 img src="{% static "images/fb.png" %}" alt="image here"