Python Django静态URL未正确呈现图像

Python Django静态URL未正确呈现图像,python,html,django,url,static,Python,Html,Django,Url,Static,我正在编写一个在页面上显示一组图像的视图 这就是模型 #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/{{

我正在编写一个在页面上显示一组图像的视图

这就是模型

#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>
当它应该尝试加载的URL为

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

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

有两个部分是如何计算图像url的

首先在
settings.py
中定义
MEDIA\u ROOT
MEDIA\u 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
然后,如果您想访问存储在
movie\u posters/poster.jpg
中的图像,该图像的绝对路径为
/abs/path/to/media/movie\u posters/poster.jpg
,其URL应为
http://localhost/media/movie_posters/poster.jpg
。您可以通过执行以下操作来计算URL:

{{ MEDIA_URL }}{{ movie.poster }}
请注意,我使用的是
媒体URL
,而不是
静态URL
。这不是一回事。然而,像这样计算URL并不是很整洁。这就是Django的
ImageField
FileField
具有
url
属性的原因:

{{ movie.poster.url }}
Django将根据您的
媒体url
设置计算正确的url

注意:

要使所有这些都起作用,您必须有一个单独的媒体服务器在运行。Django不提供任何媒体文件。在开发过程中,它只能提供静态文件(与媒体文件不同)。所以在开发中,一个很好的服务媒体文件的技巧就是使用Python的简单web服务器。为此,请打开一个新的终端(在Linux和Mac上)或命令提示符(在Windows上)窗口/选项卡,然后导航到您的媒体文件夹。然后在此处执行以下命令:

python -m SimpleHTTPServer 8090
并确保您的设置为:

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

然后Python将为您的媒体文件提供服务。这对开发很有用。

您可以定义一个自定义模板标记,该标记返回URL的基本名称,如下所示:

from django import template
import os

register = template.Library()

@register.filter
def getBasename(myURL):
   return os.path.basename(myURL)
这应该放在应用程序templatetags目录下的自定义模板标记(例如customTemplateTags.py)文件中

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

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

如果您只想使用开发服务器为您的媒体提供服务,您可以暂时将其添加到URL.py中

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