Django STATIC_ROOT, STATIC_URL, STATICFILES_DIRS

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

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

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

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

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

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

MEDIA_ROOT
— путь куда
django.core.files.storage.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.contrib.staticfiles.finders.AppDirectoriesFinder
находит файлы в
installed_app_path/static/


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

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

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