-1

我在 Django 模板中显示图像时遇到问题(我正在从管理应用程序上传图像)。我阅读了有关的文档和其他帖子,但upload_to仍然无法弄清楚。我在我的模板中尝试了这个<img src="{{ a.image}}"/>,然后得到了<img src="{{MEDIA_URL}}{{ a.image}}"/>同样的结果。这是我的 settings.py 代码:

MEDIA_ROOT = '/home/mohamed/code/eclipse workspace/skempi0/media'
MEDIA_URL = '/media/'

最后,我在我的 models.py 中尝试了以下内容,但我失败了:

image = models.ImageField(upload_to = "ads/")
image = models.ImageField(upload_to = ".")

当我使用时image = models.ImageField(upload_to = MEDIA_URL)出现以下错误

SuspiciousOperation at /admin/advertisments/banner/add/
Attempted access to '/media/cut.jpg' denied.

编辑

生成的链接如下:

<img src="./DSCN6671.JPG">

重新编辑

这是我的看法:

def index(request):
spotlightAlbum =  Album.objects.filter(spotlight = True)
spotlightSong = Song.objects.filter(spotlight = True).order_by('numberOfPlays')
homepage = Song.objects.filter(homepage = True).order_by('numberOfPlays')
ads = Banner.objects.all()
copyright = CopyrightPage.objects.get()


try:
    user = User.objects.get(userSlug = "mohamed-turki")
    playlists = UserPlaylist.objects.filter(owner = user.userFacebookId)
    purchase = Purchase.objects.filter(userName = user.userFacebookId)
    user.loginState = 1

    user.save()
except:
    user = None
    playlists = None


context = {'copyright':copyright,  'ads':ads, 'spotlightSong':spotlightSong,'spotlightAlbum': spotlightAlbum, 'homepage':homepage, 'user':user, 'playlists':playlists, 'purchase':purchase }
return render_to_response('index.html',context,context_instance = RequestContext(request))

谁能告诉我我做错了什么?PS我正在使用Django 1.4

4

4 回答 4

1

您提供的路径upload_to将是MEDIA_ROOT您在项目设置文件中设置的相对路径(通常是settings.py)。

YourMEDIA_ROOT是您上传的媒体将存储在磁盘上的MEDIA_URL位置,而 Django 将从该 URL 为它们提供服务。

因此,如果您MEDIA_ROOT/home/mohamed/code/eclipse workspace/skempi0/media并且您的模型的图像属性是:

image = models.ImageField(upload_to = "ads/")

然后,您上传的图像在磁盘上的最终主页将是/home/mohamed/code/eclipse workspace/skempi0/media/ads/whatever-you-named-your-file.ext,它将提供的 URL 是/media/ads/whatever-you-named-your-file.ext

将您的上传路径设置为settings.MEDIA_URL无效,因为这是媒体提供的位置,而不是允许将其存储在磁盘上的位置。

如果您想在模板中加载上传的图像,只需执行此操作(替换whatever为从视图发送到代表该对象的模板的变量名称):

<img src="{{ whatever.image.url }}"/>

模型上的图像属性实际上不是图像,它是代表图像的 Python 类。ImageField该类的方法之一是.url()构造图像 URL 的路径,同时考虑到您MEDIA_URL在项目设置中的设置方式。所以上面的代码片段会生成这样的 HTML:

<img src="/media/ads/whatever-you-named-your-file.ext"/>

RequestContext() 和 settings.TEMPLATE_CONTEXT_PROCESSORS

由于render_to_response()您从您的视图返回正在使用RequestContext()您需要确保您已settings.TEMPLATE_CONTEXT_PROCESSORS正确设置。查看 1.4 文档以获得进一步说明。

于 2012-05-07T15:28:13.167 回答
0

首先,我建议将 MEDIA_ROOT 更改为

MEDIA_ROOT = os.path.join(PROJECT_ROOT,'media')

这样,您可以确保媒体目录路径就在您的项目根目录下。您的 MEDIA_URL 设置正确,但在上传文件时未使用。MEDIA_ROOT 是。

关于文件上传,在您的模型中将字段设置为

image_field = models.ImageField('Image', upload_to='images/some_sub_folder')

请注意,我既没有使用前导斜杠,也没有使用尾随正斜杠。以上将PROJECT_ROOT/media/images/some_sub_folder/使用原始文件的文件名和扩展名上传图像。或者,您可以使用可调用的来更改文件名upload_to=filename_convetion- 更多信息在这里

在您的模板中,您可以使用

<img src="/media/{{ your_model.image_field }}" />

希望这会有所帮助,干杯。

于 2012-05-07T12:47:35.567 回答
0

我知道这个问题很老,但我有同样的问题,这在我的情况下解决了:

设置.py

import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
PROJECT_DIR  = os.path.dirname(__file__)

MEDIA_ROOT = os.path.join(PROJECT_DIR, "media")

MEDIA_URL = '/media/'

网址.py

然后,我的 urls.py 缺少这行代码来发现 /media/ 文件夹并显示内容:

urlpatterns += staticfiles_urlpatterns()

urlpatterns = patterns('',
    url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}, name="media_url"),
) + urlpatterns

希望它可以帮助某人。

于 2015-01-07T06:31:05.990 回答
0

upload_to需要是目录的绝对路径,而不是 web url。所以试试这个:

image = models.ImageField(upload_to = settings.MEDIA_ROOT)

在您的模板中,只需使用

<img src="{{ a.image.url }}">
于 2012-05-07T03:34:07.170 回答