Меня долго мучило: локально картинки грузятся, на сервере — пусто. Оказалось, дело в двух «мирах»: static (файлы приложения, собираются при деплое) и media (загрузки пользователей, живут где-то связанном извне). Путать их — источник «всё работало, а тут пропало».
Нейтрально: MEDIA_ROOT хранит загруженные файлы (из ImageField), и для прода важно смонтировать их так, чтобы пережили пересборку контейнера.
# settings
MEDIA_URL = "/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
# модель
class Photo(models.Model):
image = models.ImageField(upload_to="photos/")
Когда разложил static/media по ролям, ночная «как чинить деплой» ушла. Из тех тем, что джун обходит, пока не обожжётся на реальном диплее.