Django STATIC_ROOT, STATIC_URL, STATICFILES_DIRS

Новички Django постоянно не могут понять: что да как надо настраивать для статики. Я регулярно вижу новые сообщения на форумах, и испытуемые постоянно делают одни и те же ошибки с настройкой статики.

В чём вообще различие статики и медиа?

Static — файлы необходимые для работы сайта, который еще не наполнен контентом (css, js, картинки для оформления и т.п.)

Media — по сути это upload, т.е. всё что нужно для динамического контента (обычно то, что хранится в ImageField/FileField)

Как это всё настраивать?

STATIC_URL/MEDIA_URL — "префикс" с которого будут начинаться ссылки на эти файлы в отрендеренных темплейтах (кое-где Django сам будет дописывать, а в других местах нужно вставить нужную переменную/тег). Можно даже указывать полные ссылки с доменами на других серверах (если у вас нормально настроен перенос данных туда-обратно и если js нормально работает с крос-доменными запросами)

MEDIA_ROOT — путь куда django. ... .default_storage будет сохранять загруженные файлы (при желании можно использовать другой класс хранилища, который будет игнорировать эту опцию).

STATIC_ROOT — путь куда Django (а не вы) складывает файлы статики. Эту папку можно отдать на обслуживание веб-серверу.

Если папку не указать, то manage.py collect static соберёт всё в текущую папку (неважно где проект, важно откуда запустили), точно также аплоад файлов будет идти куда-попало. Если путь будет относительным то он будет зависеть от папки откуда запустили команду, а не от того где лежит проект. Однако никто не мешает вам получить абсолютный путь с помощью os.path.join and os.path.abspath(os.path.dirname(__file__))

STATICFILES_FINDERS — tuple с "путями" классов которые занимаются поиском файлов статики, для последующего складывания в STATIC_ROOT. Например 'django. ... .AppDirectoriesFinder' находит файлы в "installed_app_path/static/"

STATICFILES_DIRS — tuple с дополнительными путями где Django будет искать статику. Вот в эти папки и нужно складывать статику, которая не относится к конкретным apps

Т.е. в конечном итоге надо настроить откуда складывать, как искать и куда складывать. А после этого еще делать collectstatic. Вроде девелоперский "manage.py runserver" в некоторых местах ищет и без collectstatic, но стоит привыкать всё настраивать под сбоку статики (для nginx`a например).

Вообще это всё почти полностью описано в стандартной документации. Почему её никто не читает мне понять не дано.