无法在模板 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) 查询对象以查看它是否在那里工作? 是的,这是一个示例:&gt;&gt;&gt; from advertisments.models import *&gt;&gt;&gt; img = Banner.objects.get()&gt;&gt;&gt; img.titleu'sdfsfsf'&gt;&gt;&gt; img.image&lt;ImageFieldFile: images/IMG_25042012_091454.png&gt;&gt;&gt;&gt; img.image.url'/media/images/IMG_25042012_091454.png'&gt;&gt;&gt;` 看起来在 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 中显示图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 模板中显示保存的、动态创建的图像?

无法在引导程序中对齐图像

来自 Django 中 ImageField 的图像不会加载到模板中

为啥 Django 不在我的模板上显示我的动态背景图像

模板不显示图像 - django

Django:如何根据表单中的选定选项在模板上显示来自 django 数据库的图像?