Обслуживать статические файлы можно несколькими способами; вот мои заметки к себе:
- добавить
static/my_app/
каталог вmy_app
(см. примечание о пространстве имен ниже)
- определить новый каталог верхнего уровня и добавить его в STATICFILES_DIRS в settings.py (обратите внимание на это
The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting
)
Я предпочитаю первый способ и настройку, которая близка к способу, определенному в документации , поэтому для того, чтобы обслужить файл admin-custom.css
для переопределения нескольких стилей администратора, у меня есть такая настройка:
.
├── my_app/
│ ├── static/
│ │ └── my_app/
│ │ └── admin-custom.css
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── static/
├── templates/
│ └── admin/
│ └── base.html
└── manage.py
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
Затем это используется в шаблоне следующим образом:
{% extends "admin/base.html" %}
{% load static %}
{% block extrahead %}
<link rel="stylesheet" href="{% static "my_app/admin-custom.css" %}">
{% endblock %}
Если во время разработки вы используете django.contrib.staticfiles [ed: установлен по умолчанию], это будет сделано автоматически сервером выполнения, если для DEBUG установлено значение True [...]
https://docs.djangoproject.com/en/1.10/howto/static-files/
При развертывании я запускаю collectstatic
и обслуживаю статические файлы с помощью nginx.
Документы, которые прояснили для меня всю путаницу:
STATIC_ROOT
Абсолютный путь к каталогу, в котором collectstatic будет собирать статические файлы для развертывания.
... это не место для постоянного хранения ваших статических файлов. Вы должны сделать это в каталогах, которые будут найдены поисковиками staticfiles, которые по умолчанию являются подкаталогами приложения static / и любыми каталогами, включенными в STATICFILES_DIRS).
https://docs.djangoproject.com/en/1.10/ref/settings/#static-root
Статическое пространство имен файлов
Теперь нам, возможно, удастся разместить наши статические файлы непосредственно в my_app / static / (вместо создания другого подкаталога my_app), но на самом деле это будет плохой идеей. Django будет использовать первый найденный статический файл, имя которого совпадает, и если бы у вас был статический файл с тем же именем в другом приложении, Django не смог бы их различить. Нам нужно указать Django на нужный, и самый простой способ убедиться в этом - разместить их в пространстве имен. То есть помещая эти статические файлы в другой каталог, названный по имени самого приложения.
https://docs.djangoproject.com/en/1.10/howto/static-files/
STATICFILES_DIRS
В вашем проекте, вероятно, также будут статические активы, не привязанные к конкретному приложению. Помимо использования каталога static / внутри ваших приложений, вы можете определить список каталогов (STATICFILES_DIRS) в вашем файле настроек, где Django также будет искать статические файлы.
https://docs.djangoproject.com/en/1.10/howto/static-files/
from django.conf import settings
, конечно