Изображения из ImageField в Django не загружаются в шаблон
Я создаю галерею, используя Django (1.5.1) на моей локальной машине. В моей модели альбома у меня есть ImageField
. Существует возможность показать все изображения альбома. Он работает хорошо, но в конце изображения не отображаются. Там границы изображений, как вы можете видеть, но изображения не загружаются.
скриншот
![enter image description here]()
models.py
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/')
views.py
def detail(request, album_id):
album = get_object_or_404(Album, pk=album_id)
return render(request, 'gallery/detail.html', {'album': album})
detail.html
<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/
Затем URL изображения: http://localhost:8000/media/images/albums/photo_4.JPG (I get 404 when enter it in browser)
Этот корень носителя и URL:
MEDIA_ROOT = '/media/'
MEDIA_URL = '/localhost:8000/media/'
Мой медиа-корень имеет разрешение 777.
Что мне теперь делать? Где проблема?
Ответы
Ответ 1
У меня есть ключ к проблеме. MEDIA_URL
должен выглядеть следующим образом:
MEDIA_ROOT='<the full path to your media folder>' (i.e: '/home/ike/project/media/')
MEDIA_URL='/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
Надеюсь, что это поможет
Ответ 2
Если вы используете сервер dev, вам нужно добавить что-то на свой 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
Ответ 3
Источник: 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)
вам нужно добавить шаблон url для загрузки загруженных файлов
Ответ 4
Проверьте свой settings.py, который вы определили MEDIA_ROOT
и 'MEDIA_URL' (и они верны). MEDIA_ROOT указывает абсолютную папку на вашем компьютере, где будут храниться носители.
Итак, для примера:
MEDIA_ROOT = '/myfolder/'
Это означало бы, что он будет искать изображение по адресу:
/myfolder/images/albums/
Далее в settings.py выберите MEDIA_ROOT
местоположение: i.e.
MEDIA_URL = 'http://localhost/myfolder/'
Итак, ваши изображения:
<img src="{{ MEDIA_URL }}{{ image.image.url }}" height="420"></a>
Это будет относиться к:
http://localhost/myfolder/images/albums/
Надеюсь, что это поможет.
Ответ 5
В вашем файле details.html измените
img src="{{ image.image.url }}" height="420"
To
img src="your_app/media/{{ image.image.url }}" height="420"
Надеюсь, это поможет. Если нет, я буду рад предоставить более подробную информацию.
Ответ 6
Я взял немного от каждого из ответов выше. У меня была такая же проблема, как и вы. Я получал возвращения, которые были направлены из текущего /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/"
Ответ 7
Ну, я знаю, что этот вопрос старый, но я решил это сейчас, после того, как вы подтвердите все варианты:
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
- urls.py ОПАСНОСТЬ!!! Здесь одна из моих ошибок заключалась в том, что я использовал my_app/urls.py... Если вы хотите использовать my_app/urls.py, вам нужно добавить "/namespace_name {{image.image.url}}" в img 'src:
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)
- Ваш шаблон, detail.html
img src="{{ image.image.url }}" alt="{{ image.title }}"
ПРИМЕЧАНИЯ:
Yo не нужен MEDIA_URL, будьте осторожны с '/', потому что image.image.url является абсолютным, поэтому, если вы используете пространство имен, вам не нужно добавлять косу черты.
img src="/namespace_name/{{ image.image.url }}" --> BAD!!!
img src="/namescape_name{{ image.image.url }}" --> GOOD!!!