Управление статическими файлами для нескольких приложений в Django
Я разрабатываю проект Django (1.3), составленный многими приложениями. Каждое приложение имеет свои собственные статические файлы в своем собственном каталоге static
. Кроме того, я добавил каталог под названием project_static
, который должен содержать статические файлы, которые являются общими для различных приложений, таких как jQuery.
Проблема, с которой я немедленно сталкиваюсь, - это именование коллизий. По умолчанию collectstatic
будет просто помещать все в глобальный каталог static
, не классифицируя их по приложению. Это не работает для меня, так как каждое приложение имеет, например, файл с именем css/screen.css
.
Как я решил это, удалив django.contrib.staticfiles.finders.AppDirectoriesFinder
из STATICFILES_FINDERS
и используя namespaced static files dirs, мои настройки теперь выглядят как
STATICFILES_DIRS = (
os.path.join(PROJECT_PATH, 'project_static'),
('my_app', os.path.join(PROJECT_PATH, 'my_app', 'static')),
('another_app', os.path.join(PROJECT_PATH, 'another_app', 'static')),
...
)
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
)
Проблема заключается в том, что таким образом я теряю статические файлы для всех других приложений, например django.contrib.admin
. Конечно, я мог бы вручную добавить администратора, но я не уверен, как это сделать, не нарушая администратора, который имеет другую структуру каталогов.
Есть ли лучший способ управлять статическими файлами с несколькими приложениями?
Ответы
Ответ 1
Это та самая проблема, которая возникает при использовании специфичных для приложения каталогов templates
. Если вы просто выбросите файлы непосредственно под templates
в приложении, вы столкнетесь с конфликтами имен, если в двух приложениях или даже на уровне проекта templates
используются шаблоны с тем же именем. Исправить это - фактически разместить шаблоны в каталоге имени приложения внутри каталога templates
, например:
- some_app
- templates
- some_app
- index.html
Итак, я применяю ту же идею к static:
- some_app
- static
- some_app
- css
- img
- js
Таким образом, при запуске collectstatic, каждый отдельный статический файл приложения помещается внутри каталога с именами. Единственное изменение, которое вам нужно сделать, - это префикс каждого из файлов с помощью каталога имен приложений в ваших шаблонах. Поэтому вместо {{ STATIC_URL }}css/style.css
у вас есть {{ STATIC_URL }}my_app/css/style.css
.