Что такого сложного для Django в отображении медиа-изображений в моем шаблоне?
Правильно, что такого сложного для Django в том, чтобы разобраться с отображением изображения в шаблоне, когда DEBUG
имеет значение False?
Почему, когда я делаю буквально все правильно, он просто отказывается отображать чертово изображение на странице?
Почему, когда я правильно настроил MEDIA_URL
и MEDIA_ROOT
в settings.py
, он все равно отказывается загружать страницу? Почему, несмотря на правильную настройку моей корневой страницы urls.py
следующим образом, Django отказывается отображать изображение на веб-странице:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
<
Почему, несмотря на правильную настройку upload_to
непосредственно в моем models.py
файле, запускается makemigrations
, а также migrate
команда, делает ли Django.... вы поняли.
Почему, несмотря на установку whitenoise
и выполнение команды py manage.py collectstatic
, Django... о да, простите, мы уже делали это раньше.
Почему, когда я перехожу к "осмотру источника" в моем веб-браузере, он возвращает правильный каталог изображений, но когда я нажимаю на каталог URL изображения со страницы осмотра источника, он возвращает мою красиво оформленную пользовательскую страницу 404? Знаю, шокирует, да? Что-то действительно работает! Чуть со стула не упал!
Почему?
Почему, что бы я ни делал, я все равно получаю один и тот же результат? Почему, сколько бы я ни добавлял и ни убирал слэшей в переменных MEDIA_URL
и MEDIA_ROOT
на странице settings.py
, я все равно получаю КОРРЕКТНЫЙ URL изображения на странице inspect source
, но изображение все равно не отображается? Почему, независимо от того, сколько я отдаю своего здравомыслия, я все равно получаю тот же результат?
Я прошел все стандартные процедуры диагностики, известные Вселенной и моей собаке (и нет, лай и рычание на Django не помогли, если кому-то из вас в этом сообществе интересно, работает ли это. Не помогает.), я прочитал документацию Django, я даже прибегнул к стоянию на одной ноге, прыгал вверх-вниз и пел песенку хоки-коки в надежде, что это действительно заставит Django делать то, что ему говорят.
Вот мой код:
#urls.py
"""
URL configuration for blauwestadtech project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/4.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include
from . import views
from django.conf import settings
from django.conf.urls.static import static
from django.views.static import serve
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.index),
....
]
# Only for development. Do not use this in production.
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
#models.py
from django.db import models
# Create your models here.
class MediaModule(models.Model):
...
....
article_image = models.ImageField(upload_to='assets/')
...
...
...
#settings.py
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
#template.html
<div class="article-container__article-image">
<img src="{{article.article_image.url}}" alt="{{article.article_image.url}}"/>
</div>
Простите, но это настолько логично, что вопиюще очевидно: settings.py
говорит Django, что базовый каталог - это файл media
, который является именем приложения, upload_to
говорит Django, куда конкретно загружать плитку, внутри приложения media
, следовательно, каталог - это ROOT > media > assets
, что в точности соответствует тому, что показывает каталог, когда я осматриваю источник веб-страницы.
Почему Django считает, что просто вывести изображение на экран - это такая ужасная проблема?
Я не глупый человек, но Джанго, кажется, просто оскорбляет мой интеллект.
Добавил слеши, удалил слеши, добавил слеши, удалил слеши, снова добавил еще один слеш, так как в этот момент я сомневался в собственном здравомыслии и не мог вспомнить, добавил ли я слеш, добавив ведущий слеш, удалил ведущий слеш или удалил слеш, удалил слеш, удалил ведущий слеш или просто получил нервный срыв, проверьте источник сайта, чтобы подтвердить каталог, с которого (очевидно) читает браузер.
Я повторил процесс для каталога upload_to
в моем файле models.py
, а затем быстро вспомнил, как я потерял рассудок за несколько секунд до этого.
И да, я с болью осознаю, что здесь есть миллиард вопросов с аналогичной проблемой, они либо были опубликованы 56 лет назад и с тех пор Django выпустил значительное количество версий, что сделало указанные решения устаревшими, либо ответы, данные в более свежих сообщениях 55-летней давности, были грубо неточными.
Я точно знаю, что это не может быть так сложно, это не может быть так невозможно. Я специально указал Django, где хранится изображение, и выполнил команду collectstatic
, чтобы изображения обслуживались правильно. Тем не менее, изображения не передаются.