我正在本地机器上使用Django(1.5.1)构建一个库。在我的相册模型中,我有一个ImageField
。可以显示相册的所有图像。它运作良好,但最终图像不会显示。您可以看到图像的边框,但图像无法加载。
class Category(models.Model):
###
class Album(models.Model):
category = models.ForeignKey(Category, related_name='albums')
###
class Image(models.Model):
album = models.ForeignKey(Album)
image = models.ImageField(upload_to = 'images/albums/')
def detail(request, album_id):
album = get_object_or_404(Album, pk=album_id)
return render(request, 'gallery/detail.html', {'album': album})
<h1>{{ album.title }}</h1>
{% for image in album.image_set.all %}
<a> <img src="{{ image.image.url }}" height="420"></a>
{% endfor %}
如果这是我的相册地址:http://localhost:8000/gallery/1/
然后图片网址为:http://localhost:8000/media/images/albums/photo_4.JPG (I get 404 when enter it in browser)
此媒体根目录和网址:
MEDIA_ROOT = '/media/'
MEDIA_URL = '/localhost:8000/media/'
我的媒体root拥有 777权限。
我现在该怎么办?问题在哪里?
答案 0 :(得分:32)
我知道问题是什么。 MEDIA_URL
应该是这样的:
MEDIA_ROOT='<the full path to your media folder>' (i.e: '/home/ike/project/media/')
MEDIA_URL='/media/'
注意开头的斜线字符。这是因为media是根服务器文件夹中的文件夹,与您调用的其他URL无关。
并将这些行添加到urls.py
文件的末尾:
# You might need to import static function like this:
#from django.contrib.staticfiles.urls import static
urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
您可以查看以下文档:https://docs.djangoproject.com/en/dev/howto/static-files
希望这有帮助
答案 1 :(得分:5)
如果您正在使用开发服务器,那么您需要在urls.py中添加一些东西以使django提供媒体文件,cf:
1.4.x:https://docs.djangoproject.com/en/1.4/howto/static-files/#serving-other-directories 1.5.x:https://docs.djangoproject.com/en/dev/howto/static-files/#serving-files-uploaded-by-a-user
答案 2 :(得分:2)
来源:https://docs.djangoproject.com/en/dev/howto/static-files/#serving-files-uploaded-by-a-user
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
您需要添加到网址模式以提供上传的文件
答案 3 :(得分:1)
检入 settings.py ,您已定义MEDIA_ROOT
和'MEDIA_URL'(并且它们是正确的)。 MEDIA_ROOT指定机器上存储介质的绝对文件夹。
举个例子:
MEDIA_ROOT = '/myfolder/'
这意味着它会寻找图片:
/myfolder/images/albums/
接下来在 settings.py 中检查您的MEDIA_ROOT
位置:即。
MEDIA_URL = 'http://localhost/myfolder/'
所以你的形象:
<img src="{{ MEDIA_URL }}{{ image.image.url }}" height="420"></a>
这与:
有关http://localhost/myfolder/images/albums/
希望这有帮助。
答案 4 :(得分:1)
在 details.html 中,更改您的
img src="{{ image.image.url }}" height="420"
到
img src="your_app/media/{{ image.image.url }}" height="420"
我希望这会有所帮助。如果没有,我会很乐意提供更多细节。
答案 5 :(得分:0)
我从上面的每个答案中略微提了一下。我遇到了和你一样的问题。我得到的回报来自当前的/blog/post/(media_url)/image.jpg
在我的管理员门户网站中,我可以轻松查看并编辑它。但在我的post.html上,我遇到了问题,直到我添加了{{MEDIA_URL}} -
这就是我所缺少的一切。
我在下面发布了我的整个部分,以便其他人可以阅读它并查看它们缺少的内容。
post.html:
<label for="id_image"> <img src="{{ MEDIA_URL }}{{ p.image.url }}"
title="{{ p.title }}"> </label>
models.py:
from django.core.files.storage import FileSystemStorage
upload_location =
FileSystemStorage(location='/home/pi/djcode/xpcpro/xpcpro/images')
class Blog(models.Model):
title = models.CharField(max_length=255)
author = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
date = models.DateTimeField(auto_now=False, auto_now_add=True)
body = models.TextField()
image = models.ImageField(
storage=upload_location, null=True,
blank=True, width_field="width_field",
height_field="height_field",)
height_field = models.IntegerField(default=0)
width_field = models.IntegerField(default=0)
urls.py:
from django.conf.urls.static import static
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT)
settings.py:
MEDIA_ROOT = "/home/pi/djcode/xpcpro/xpcpro/images/"
MEDIA_URL = "/images/"
答案 6 :(得分:0)
嗯,我知道这个问题已经过时了但我在证明所有选项后立即解决了这个问题:
MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
from django.conf.urls.static import static from django.contrib.staticfiles.urls import staticfiles_urlpatterns from django.conf import settings urlpatterns += staticfiles_urlpatterns() urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
img src="{{ image.image.url }}" alt="{{ image.title }}"
注意: 哟不需要MEDIA_URL,小心使用'/',因为image.image.url是绝对的,所以如果你使用命名空间,那么你不需要添加结束斜杠。
img src="/namespace_name/{{ image.image.url }}" --> BAD!!! img src="/namescape_name{{ image.image.url }}" --> GOOD!!!