Подтвердить что ты не робот

Управление статическими файлами для нескольких приложений в 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. Конечно, я мог бы вручную добавить администратора, но я не уверен, как это сделать, не нарушая администратора, который имеет другую структуру каталогов.

Есть ли лучший способ управлять статическими файлами с несколькими приложениями?

4b9b3361

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