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

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

У меня есть модель Blog Post. В администраторе я хочу иметь возможность добавлять изображение в мою модель с помощью 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. Мой просмотр работает хорошо, и я не думаю, что там есть какая-то проблема.

Вот мой 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/'

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

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

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

Наконец, моя/статическая папка и папка my/media находятся в одном каталоге. Это как в моем каталоге приложения, так и в блоге.

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

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

0
источник поделиться
1 ответ

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

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

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

Изменения, внесенные мной в настройки, были выполнены благодаря печати MEDIA_ROOT в консоли. Я изменил синтаксис и направление косой черты (blog\media). Я также удалил обработчик контекста, показанный выше, в моих параметрах TEMPLATES.

Вот что для меня работает:

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">
0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос