0

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

这是模型

#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

当它应该尝试加载的 URL 是

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/最后是电影海报。如何正确渲染图像?

4

3 回答 3

6

图片 url 的计算方式有两种。

首先在settings.py你定义MEDIA_ROOT. MEDIA_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。为此,您MEDIA_URLsettings.py. 这实际上将 URL 映射到您的MEDIA_ROOT位置。那么,如果您MEDIA_URL是:

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

然后,如果您要访问存储的图像,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 }}

请注意,我使用MEDIA_URL的是STATIC_URL. 这些不是一回事。然而,像这样计算 url 并不是很整洁。这就是为什么 DjangoImageFieldFileField一个url属性:

{{ movie.poster.url }}

然后,Django 将根据您的MEDIA_URL设置计算正确的 url。

笔记:

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

python -m SimpleHTTPServer 8090

并确保您的设置是:

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

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

于 2012-10-31T01:25:59.303 回答
1

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

urlpatterns = patterns( ...all your awesome urls...) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
于 2012-10-31T05:51:25.497 回答
0

您可以定义一个自定义模板标记,该标记返回 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>
于 2012-10-31T01:44:56.923 回答