несколько дней из-за того, что считал её не особо сложной, ну или я просто тупой.
Перехожу к сути, проблема с изображениями. В settings.py уже давно повбивал и STATIC_URL="/static/", и STATIC_ROOT= os.path.join(BASE_DIR, "/static/") (с MEDIA_URL/ROOT практически также, только указал, что папка медиа лежит в папке статик). Немного позже объясню зачем я это упомянул.
Я же правильно понимаю, что изображения должны храниться в отдельной папке (media), а эта папка с изображениями должна храниться в статике, т.к изображения относятся к статической лабуде, как и css и js файлы.
Еще один важный момент нужно уточнить, мой путь к изображению хранится в поле экземпляра модели и именно его я ввожу в атрибут src тега img. И насколько я понимаю путь к файлу с изображением не должен быть полным, т.е. только папка, в которой лежит файл и имя самого файла(/media/photo.png). Ну, а как иначе-то, когда буду заливать сайт на хост, то там нихера и не будет диска C и подобной штуки.
Я пытался и добавлять к списку urlpatterns в urls.py что-то (результат работы функции static, вроде, передавая в неё MEDIA_URL и ROOT). И ничего не работало, просто файл не находился.
А потом решил другим способом вывести картинку. Прописал прямо перед тегом выражение {%load static%}(в html файле), еще и в src атрибут передал выражение, а не просто путь: {%static post.image%} (post.image это непольный путь к изображению). И потом...
Все заработало, изображение нашлось и нормально отобразилось.
Оглядываясь на все описанное выше я не понимаю, почему пришел к выводу, что указание одного неполного пути к картинке будет достаточно. Возможно из-за того, что думал джанга возьмет и найдет файл, пройдясь по MEDIA_ROOT или где-то подобную чушь вычитал. Но зачем тогда прописывать MEDIA_URL/ROOT, если убрав их и применив статику (функции static) ничего не меняется и все нормально отображается?
Может как-то иначе нужно выводить изображения и я херню какую-то сделал, которая чудом работает? Да и вообще, нормально ли работать с изображениями силами одной Джанги (когда изображение не находилось докопался до того, что "вывод изображений с помощью django.contrib.staticfiles не безопасен в реальном бою, нужно использовать nginx или апачу")? Или джанга в связке с ним только и работает?
P.s. по поводу поля, в котором хранится путь к картинке, это поле является ImageField
Для отображения на странице нужен относительный путь. MEDIA_ROOT нужна, чтобы джанга знала куда складывать файлы и при включенном дебаг режиме знать откуда их отображать.
media - это контентные файлы, например картинки статей, те что грузятся из админки или пользователями static - условно статика необходимая для работы сайта, такая как js, css файлы, а так же картинки которые необходимы для отображения самого сайта(условно картинки кнопок, фонов сайта... чего то такого) Суть в том что обычно это так /static /media а не /static /static/media Да обработка статики обычно идет за счет nginx, ибо он статику отдает более быстро. И ему требуется на много меньше ресурсов чем самой django(python). {%load static%} И работа через этот модуль именно для статичных файлов абсолютно верна. Но не путать с media файлами. Надеюсь я верно понял твой вопрос... 🙂
Обсуждают сегодня