我在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
答案 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"/>
由于您从视图中返回的render_to_response()
正在使用RequestContext()
,因此您需要确保正确设置settings.TEMPLATE_CONTEXT_PROCESSORS
。 Check 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)
我知道这个问题已经过时了,但我遇到了同样的问题,这在我的案例中解决了:
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缺少这行代码来发现/ media /文件夹并显示内容:
urlpatterns += staticfiles_urlpatterns()
urlpatterns = patterns('',
url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}, name="media_url"),
) + urlpatterns
希望它可以帮助别人。