Управление статическими файлами для нескольких приложений в Django - PullRequest
43 голосов
/ 25 августа 2011

Я занимаюсь разработкой проекта Django (1.3), состоящего из множества приложений. Каждое приложение имеет свои статические файлы в своем собственном каталоге static. Кроме того, я добавил каталог с именем project_static, который должен содержать статические файлы, которые являются общими для различных приложений, таких как jQuery.

Я сразу же столкнулся с проблемой именования коллизий. По умолчанию collectstatic просто помещает все в глобальный каталог static, не классифицируя их по приложениям. Это не работает для меня, так как каждое приложение имеет, например, файл с именем css/screen.css.

Я решил это, удалив django.contrib.staticfiles.finders.AppDirectoriesFinder из STATICFILES_FINDERS и используя статические файлы с пространством имен , поэтому мои настройки теперь выглядят так:

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 Ответ

46 голосов
/ 30 декабря 2011

Это та же проблема, которая возникает при использовании специфичных для приложения каталогов templates. Если вы просто добавите файлы прямо под templates в приложение, вы получите конфликты имен, если два приложения или даже каталог templates уровня проекта используют шаблоны с одинаковыми именами. Исправление для этого заключается в том, чтобы фактически поместить шаблоны в каталог с именем приложения внутри каталога templates, например:

- some_app
    - templates
        - some_app
            - index.html

Итак, я применяю ту же идею к статическому:

- some_app
    - static
        - some_app
            - css
            - img
            - js

Таким образом, когда вы запускаете collectstatic, статические файлы каждого отдельного приложения помещаются в каталог с пространством имен. Единственное изменение, которое вам нужно сделать, - это префикс каждого файла с каталогом app-name в ваших шаблонах. Таким образом, вместо {{ STATIC_URL }}css/style.css у вас есть {{ STATIC_URL }}my_app/css/style.css.

...