2012-10-31 44 views
0

我正在编写一个视图,在页面上显示一组图像。Django静态URL无法正确呈现图像

这是模型

#models.py 
class Movie(models.Model): 
    title = models.CharField(max_length = 500) 
    poster = models.ImageField(upload_to = 'qanda/static/movie_posters') 

#index.html 
    <img src = "{{ STATIC_URL }}movie_posters/{{ movie.poster }}"></a> 

当我RUNSERVER,图像不会出现。图像试图加载的URL是

http://127.0.0.1:8000/static/movie_posters/qanda/static/movie_posters/image.jpg 

当它应该是试图加载的URL是

http://127.0.0.1:8000/static/movie_posters/image.jpg 

我的假设是,由于movie.poster位于“qanda /静态/ movie_posters ',当我在HTML上渲染它时,它将加载静态URL(127.0.0:8000 /静态),然后加载位置'qanda/static/movie_posters'。如何正确渲染图像?

回答

6

有两个图像url的计算方式。

首先在您的settings.py中定义MEDIA_ROOTMEDIA_ROOT指定您的计算机上存储介质的绝对文件夹。因此,例如,这些设置:

MEDIA_ROOT = '/abs/path/to/media/' 

,如果你有一个字段

models.ImageField(upload_to='movie_posters') 

然后图像将被存储在:

/abs/path/to/media/movie_posters/ 
/abs/path/to/media/movie_posters/poster.jpg <- example 

该处理的是媒体存储在您的硬盘。

第二部分是如何计算这些媒体文件的URL。为此,您在settings.py中定义了MEDIA_URL。这实质上是将一个URL映射到您的MEDIA_ROOT位置。所以,这时如果你的MEDIA_URL是:

MEDIA_URL = 'http://localhost/media/' 

然后,如果你想访问存储在movie_posters/poster.jpg其中有/abs/path/to/media/movie_posters/poster.jpg绝对路径的图像,其网址应该是http://localhost/media/movie_posters/poster.jpg。您可以通过执行计算的网址:

{{ MEDIA_URL }}{{ movie.poster }} 

请注意,我用的MEDIA_URL代替STATIC_URL。这些不是一回事。但是,计算这样的网址并不是很整洁。这就是为什么Django的ImageFieldFileField有一个url属性:

{{ movie.poster.url }} 

Django会然后计算取决于你MEDIA_URL设置正确的URL。

注:

所有这一切工作,你必须有一个单独的媒体服务器上运行。 Django不提供任何媒体文件。在开发中它只能提供静态文件(与媒体文件不同)。因此在开发过程中,服务媒体文件的一个很好的诀窍是使用Python的简单Web服务器。为此,打开一个新的终端(在Linux和Mac上)或命令提示符(在Windows上)窗口/选项卡并导航到您的媒体文件夹。然后,只需执行下面的命令有:

python -m SimpleHTTPServer 8090 

,并确保您的设置是:

MEDIA_URL = 'http://localhost:8090/' 

然后Python将满足您的多媒体文件。这对于开发很有用。

+1

+1精辟的总结添加此。 –

+0

真棒谢谢!作品 –

0

您可以定义自定义模板标签返回的URL的这样的基本部分:您templatetags目录内

from django import template 
import os 

register = template.Library() 

@register.filter 
def getBasename(myURL): 
    return os.path.basename(myURL) 

这应该在您的自定义模板标签去文件(如customTemplateTags.py。)的应用程序。

然后,您可以使用过滤器只获取图像文件名,而不是整个URL。

{% load customTemplateTags %} 
<img src = "{{ STATIC_URL }}movie_posters/{{ movie.poster.url|getBasename }}"></a> 
1

如果你想为你的媒体只是用发展的服务器,你可以暂且您urls.py

urlpatterns = patterns(...all your awesome urls...) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)