Изображение Django ImageField не отображается

Я пытаюсь использовать Django 2.0. Сейчас я использую «runserver» для разработки, поэтому имейте в виду, что я еще не в продакшене. Я знаком с различиями между ними в отношении статических файлов.

У меня есть модель поста в блоге. В админке я хочу иметь возможность добавлять изображение к моей модели с помощью ImageField. Я бы хотел, чтобы он был необязательным и предоставлял изображение по умолчанию, если оно не добавлено.

Я могу загружать изображения в админке. Я не могу отобразить свое изображение в своем шаблоне. Консоль показывает, что Django пытается ПОЛУЧИТЬ мой образ, но мои конфигурации пока не работают.

Вот моя модель и соответствующее поле:

from PIL import Image

class Post(models.Model):
    ....
    thumbnail = models.ImageField(default='/img/default.png', upload_to='img', blank=True, null=True)
    ....

Моя модель хорошо работает помимо ImageField. My View работает хорошо, и я не думаю, что здесь есть какие-то проблемы.

Вот мой urls.py

....
from django.conf.urls.static import static
from django.conf import settings
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from . import views   

urlpatterns = [
....
path('posts/', views.PostListView.as_view(), name='post_list'),
path('post/<int:pk>/', views.PostDetailView.as_view(), name='post_detail'),
path('post/random/', views.random_post, name='random_post'),

]
urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Я совсем не уверен, как обрабатывать статические файлы и мультимедийные файлы в моем urls.py, особенно с изменениями в Django в версии 2.0.

Вот мои соответствующие настройки.

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_URL = '/static/'
TEMPLATES = [
    {
        ...
        'OPTIONS': {
            'context_processors': [
                ....
                'django.contrib.messages.context_processors.media',
                ....
                ]
         },
    },
]

MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace('\\', '/') 
MEDIA_URL = '/media/'

Я также не уверен, что добавить в свой файл settings.py относительно мультимедиа. Мои статические файлы CSS работают нормально. У меня есть изображение логотипа в моих статических файлах, которое отображается в моем базовом шаблоне.

Вот мой тег шаблона для ImageField:

<img class="card-image mr-3" src="{{ post.thumbnail.url }}" alt="Generic placeholder image">

Наконец, моя папка / static и моя папка / media находятся в одном каталоге. Оба они находятся в моем каталоге приложений / blog.

Может ли кто-нибудь увидеть здесь какие-либо вопиющие ошибки или внести предложения? Моя проблема в том, что изображение по умолчанию не загружается. Изображение по умолчанию находится в правильном каталоге / media / img /. В предупреждении консоли говорится: «Не найдено: /media/img/default.png».

Заранее спасибо. Любые предложения будут полезны.


person Ron Raney    schedule 16.01.2018    source источник
comment
Что оценивает MEDIA_ROOT? Вы уверены, что вам нужен replace()? Я бы изменил значение по умолчанию на default='img/default.png' без ведущей косой черты. Однако я не думаю, что это настоящая проблема.   -  person Alasdair    schedule 16.01.2018
comment
Я уберу replace () в Settings.py. Я заменю ведущую косую черту. Как оценить MEDIA_ROOT? Я скопировал URL на изображение. 127.0.0.1:8000/media/img/default.png. Он не находит /media/img/default.png, но изображение находится в этих каталогах.   -  person Ron Raney    schedule 16.01.2018
comment
Просто добавьте print(MEDIA_ROOT) в свои настройки, чтобы проверить его значение.   -  person Alasdair    schedule 16.01.2018
comment
Спасибо. Я решил это. Я не указывал название своего приложения в MEDIA_ROOT.   -  person Ron Raney    schedule 16.01.2018


Ответы (2)


Django ImageField для панели администратора

Важно указать MEDIA_URL в urls.py. Без этого фреймворка определения не дает вам разрешение на доступ к изображению Setting.py

MEDIA_URL = '/uploads/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads')

urls.py

if settings.DEBUG: # new
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Models.py

class Product(models.Model):
    title = models.CharField(max_length=150)
    image=models.ImageField(blank=True,upload_to='images/')

    def __str__(self):
       return self.title

    def image_tag(self):
        return mark_safe('<img src="{}" height="50"/>'.format(self.image.url))
    image_tag.short_description = 'Image'

Admin.py

class ProductAdmin(admin.ModelAdmin):
list_display = ['title','image_tag']
readonly_fields = ('image_tag',)
person Yuksel CELIK    schedule 12.03.2020

Печать корневого каталога носителя помогла мне решить эту проблему. Спасибо, Аласдер.

Я не думаю, что с моим полем модели выше возникла какая-то проблема.

Код urls.py, который я в итоге использовал, взят непосредственно из документации Django для Django 2.0 при обработке статических файлов https://docs.djangoproject.com/en/2.0/howto/static-files/.

Изменения, которые я внес в настройки, были сделаны благодаря печати моего MEDIA_ROOT в консоли. Я изменил синтаксис и направление косой черты (блог \ медиа). Я также удалил обработчик контекста, показанный выше, в моих опциях ШАБЛОНОВ.

Вот что мне подходит:

models.py

thumbnail = models.ImageField(default='img/default.png', upload_to='img', blank=True, null=True)

urls.py

from django.conf.urls.static import static
from django.conf import settings

urlpatterns = [...] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

settings.py

MEDIA_ROOT = os.path.join(BASE_DIR, 'blog\media')
MEDIA_URL = '/media/'

print(MEDIA_ROOT)

Тег шаблона

<img class="card-image mr-3" src="{{ post.thumbnail.url }}" alt="Generic placeholder image">
person Ron Raney    schedule 16.01.2018