Django静态URL无法正确呈现图像

Chr*_*Yin 0 html python 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/{{ movie.poster }}"></a>
Run Code Online (Sandbox Code Playgroud)

当我运行服务器时,图像不会出现.图像尝试加载的URL是

http://127.0.0.1:8000/static/movie_posters/qanda/static/movie_posters/image.jpg
Run Code Online (Sandbox Code Playgroud)

当它应该尝试加载的URL是

http://127.0.0.1:8000/static/movie_posters/image.jpg
Run Code Online (Sandbox Code Playgroud)

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

mik*_*725 6

图像网址的计算方式有两部分.

首先在settings.py你的定义中MEDIA_ROOT.MEDIA_ROOT指定计算机上将存储媒体的绝对文件夹.例如,对于这些设置:

MEDIA_ROOT = '/abs/path/to/media/'
Run Code Online (Sandbox Code Playgroud)

如果你有一个领域

models.ImageField(upload_to='movie_posters')
Run Code Online (Sandbox Code Playgroud)

然后图像将存储在:

/abs/path/to/media/movie_posters/
/abs/path/to/media/movie_posters/poster.jpg <- example
Run Code Online (Sandbox Code Playgroud)

这涉及媒体存储在硬盘上的位置.

第二部分是如何计算这些媒体文件的网址.为此你定义MEDIA_URL在你的settings.py.这实际上是将URL映射到您的MEDIA_ROOT位置.那么如果你MEDIA_URL是:

MEDIA_URL = 'http://localhost/media/'
Run Code Online (Sandbox Code Playgroud)

然后,如果要访问存储movie_posters/poster.jpg的绝对路径为的图像/abs/path/to/media/movie_posters/poster.jpg,则其URL应为http://localhost/media/movie_posters/poster.jpg.您可以通过执行以下操作来计算URL:

{{ MEDIA_URL }}{{ movie.poster }}
Run Code Online (Sandbox Code Playgroud)

请注意我使用的是MEDIA_URL代替STATIC_URL.那些不是一回事.然而,计算这样的网址并不是很整洁.这就是为什么Django的ImageField并且FileField有一个url属性:

{{ movie.poster.url }}
Run Code Online (Sandbox Code Playgroud)

然后Django将根据您的MEDIA_URL设置计算正确的URL .

注意:

要使所有这些工作,您必须运行单独的介质服务器.Django不提供任何媒体文件.在开发中,它只能提供静态文件(与媒体文件不同).因此在开发中,提供媒体文件的一个好方法是使用Python的简单Web服务器.为此,打开一个新终端(在Linux和Mac上)或命令提示符(在Windows上)窗口/选项卡,然后导航到您的媒体文件夹.然后在那里执行以下命令:

python -m SimpleHTTPServer 8090
Run Code Online (Sandbox Code Playgroud)

并确保您的设置是:

MEDIA_URL = 'http://localhost:8090/'
Run Code Online (Sandbox Code Playgroud)

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