无法在模板Django中显示图像

时间:2012-05-06 21:57:01

标签: django django-admin django-templates

我在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">

RE-修改

以下是我的观点:

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))

有人可以告诉我,我做错了什么? P.S我正在使用Django 1.4

4 个答案:

答案 0 :(得分:1)

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

MEDIA_ROOT是您上传的媒体将存储在磁盘上的位置,而MEDIA_URL是Django将为其提供服务的网址。

因此,如果您的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,其中提供的网址为/media/ads/whatever-you-named-your-file.ext

将上传路径设置为settings.MEDIA_URL将不起作用,因为这是媒体服务的位置,而不是允许存储在磁盘上的位置。

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

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

模型上的图像属性实际上不是图像,它是表示图像的Python类。 ImageField类的其中一个方法是.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_PROCESSORSCheck out the 1.4 docs需要进一步澄清。

答案 1 :(得分:0)

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

image = models.ImageField(upload_to = settings.MEDIA_ROOT)
在模板中

,只需使用

<img src="{{ a.image.url }}">

答案 2 :(得分: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 - 更多信息here

在模板中,您可以使用

访问图像
<img src="/media/{{ your_model.image_field }}" />

希望这会有所帮助,欢呼。

答案 3 :(得分:0)

我知道这个问题已经过时了,但我遇到了同样的问题,这在我的案例中解决了:

settings.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/'

urls.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

希望它可以帮助别人。