无法在模板 Django 中显示图像
Posted
技术标签:
【中文标题】无法在模板 Django 中显示图像【英文标题】:Failing to show images in templates Django 【发布时间】:2012-05-15 12:31:07 【问题描述】:我在 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))
谁能告诉我我做错了什么? P.S 我正在使用 Django 1.4
【问题讨论】:
当你使用 和其他方法时,如果你真的在浏览器中导航到给定的 URL 会发生什么?你能在你的浏览器没有链接? 请显示生成的图片链接以及图片实际上传到的位置 【参考方案1】:upload_to
需要是 目录 的绝对路径,而不是 Web url。所以试试这个:
image = models.ImageField(upload_to = settings.MEDIA_ROOT)
在您的模板中,只需使用
<img src=" a.image.url ">
【讨论】:
我试过这个,当我上传图片时,我得到了 SuspiciousOperation 错误。 好吧,那肯定还有什么问题。我想知道您的 MEDIA_ROOT 中的空间是否导致问题?我写的代码肯定可以工作。 我在不同的位置(没有空格)尝试了同样的事情,当我从管理面板上传图像时,我遇到了同样的错误“SuspiciousOperation”。【参考方案2】:首先,我建议将 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】:您在upload_to
中提供的路径将是您在项目设置文件中设置的MEDIA_ROOT
的相对路径(通常是settings.py
)。
您的MEDIA_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
。所以上面的sn-p会生成这样的HTML:
<img src="/media/ads/whatever-you-named-your-file.ext"/>
RequestContext() 和 settings.TEMPLATE_CONTEXT_PROCESSORS
由于您从视图返回的render_to_response()
使用的是RequestContext()
,因此您需要确保正确设置了settings.TEMPLATE_CONTEXT_PROCESSORS
。 Check out the 1.4 docs 进一步澄清。
【讨论】:
我又一次惨败。我尝试了你提到的一切,但同样的问题。这让我发疯了! 您是否尝试过从 shell (python manage.py shell
) 查询对象以查看它是否在那里工作?
是的,这是一个示例:>>> from advertisments.models import *
>>> img = Banner.objects.get()
>>> img.title
u'sdfsfsf'
>>> img.image
<ImageFieldFile: images/IMG_25042012_091454.png>
>>> img.image.url
'/media/images/IMG_25042012_091454.png'
>>>
`
看起来在 shell 中一切正常,因此,如果它在您的模板中不起作用,则可能是您的项目配置有问题。你在本地开发吗?你的 settings.TEMPLATE_CONTEXT_PROCESSORS 是什么样的?另外,你的视图代码是什么样的,你用的是render_to_response()
吗?
我的设置中没有 TEMPLATE_CONTEXT_PROCESSORS 这一行,它应该在 Django 1.4 中吗?另外,请查看新编辑的原始帖子以了解我的观点。【参考方案4】:
我知道这个问题很老,但我遇到了同样的问题,这在我的情况下解决了:
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
希望它可以帮助某人。
【讨论】:
以上是关于无法在模板 Django 中显示图像的主要内容,如果未能解决你的问题,请参考以下文章