Почему не подхватывается изображение в Django?

myapp/models.py
#! coding: utf-8
from django.db import models

# Альбом с фотографиями
class Album(models.Model):
    title = models.CharField("Название альбома", max_length=100)
    slug = models.SlugField("Ссылка для альбома", max_length=100, unique=True)
    img = models.ImageField("Изображение альбома", upload_to='images',
                            help_text='Размер изображения 200px на 200px')

    class Meta:
        ordering = ['title']
        verbose_name = 'Альбом'
        verbose_name_plural = 'Альбомы'

    def __unicode__(self):
        return self.title
    def __str__(self):
        return self.title


class Photo(models.Model):
    title = models.CharField("Название фотографии", max_length=100)
    album = models.ForeignKey(Album, verbose_name='Альбом')
    img = models.ImageField("Фото", upload_to='images',
                            help_text='Желательно, чтоб фото было не большого размера')

    class Meta:
        ordering = ['title']
        verbose_name = 'Фото'
        verbose_name_plural = "Фотографии"

    def __unicode__(self):
        return self.title
    def __str__(self):
        return self.title
    def image_thumb(self):
        return '<img src="/media/%s" width="100" height="100" />'  % (self.img)
    image_thumb.allow_tags = True


myapp/admin.py
from django.contrib import admin
from photos.models import Album, Photo
#
#Для альбома
class AlbumAdmin(admin.ModelAdmin):
    fieldsets = [
        (None, {'fields': ['title', 'slug', 'img']})
    ]
    list_display = ['title', 'slug']
    prepopulated_fields = {'slug': ['title']}
    ordering = ['title']
#
#Для фотографии
class PhotoAdmin(admin.ModelAdmin):
    fieldsets = [
        (None, {"fields": ['title', 'album', 'img']})
    ]
    list_display = ['title', 'album', 'image_thumb']
    ordering = ['title']


admin.site.register(Album, AlbumAdmin)
admin.site.register(Photo, PhotoAdmin)


settings.py
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
...
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))
...
MEDIA_ROOT = '/home/hivetraum/Dropbox/Работа/Галовед/galoved/galoved/media/'
MEDIA_URL = '/media/'


Непосредственно сама проблема:
По какой причине загруженные изображения недоступны и соответственно не отображаются в админке
Перепробовал кучу снипетов с миниатюрами в админке, везде примерно одинаковый результат

7ca3866c74644514b11616fe1d122100.png5e2f4da247424ba19204d6bd31a7aa3b.png
  • Вопрос задан
  • 1135 просмотров
Пригласить эксперта
Ответы на вопрос 4
mututunus
@mututunus
Backend developer (Python, Golang)
urls.py
from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Ответ написан
Комментировать
sim3x
@sim3x
джанга подефолту не занимается твоей статикой
from settings import DEBUG, MEDIA_URL, MEDIA_ROOT
if DEBUG:
    urlpatterns += static(MEDIA_URL, document_root=MEDIA_ROOT)
    urlpatterns += staticfiles_urlpatterns()
Ответ написан
@marazmiki
Укротитель питонов
Ребята в общем-то всё правильно сказали о раздаче статики. Я бы хотел дополнить топик ещё одним решением, которое мне нравится больше. Заключается оно в использовании wsgi-миддльвари dj-static.

Чтобы подключить статику, нужно дописать в wsgi.py проекта
from django.core.wsgi import get_wsgi_application
from dj_static import Cling, MediaCling

application = Cling(MediaCling(get_wsgi_application()))

и всё. Править urls.py не надо.

Очевидные плюсы — этой штукой можно раздавать статику даже в продакшн-окружении. Те, кто размещал джанго-проекты на хостинге heroku, так и поступают. И, как упоминалось выше, не нужно вносить дополнительные девелоперские url-схемы в urls.py.

Очевидные минусы — дополнительная зависимость (хотя разве ж это минус?). Ставится через pip:

$ pip install dj-static
Ответ написан
un1t
@un1t
runserver по дефолту раздает static, но не раздает media. Надо добавить в urls.py как написали выше.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы