如何在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的工作方式(据我所知,是:
- 在html文件中,它使用setting.py中的MEDIA_URLpathreplaceMEDIA_URL
- 它在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.jpg
: http://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服务器( Apache , LightTpd等)提供静态文件。
如果您的文件是模型中的模型字段,则也可以使用模板标记中的“.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"