Изображения из 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

Надеюсь, что это поможет

Ответ 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

Ну, я знаю, что этот вопрос старый, но я решил это сейчас, после того, как вы подтвердите все варианты:

  • settings.py:
    MEDIA_URL = '/media/'
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
  1. 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)
  1. Ваш шаблон, 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!!!