web-dev-qa-db-ja.com

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など)の静的ファイルが失われることです。もちろん、手動で管理者を追加することもできますが、ディレクトリ構造が異なる管理者を壊さずにこれを行う方法がわかりません。

複数のアプリケーションで静的ファイルを管理するためのより良い方法はありますか?

44
Andrea

これは、アプリ固有のtemplatesディレクトリを使用する場合に発生する問題と同じです。アプリのtemplatesのすぐ下にファイルをスローする場合、2つのアプリまたはプロジェクトレベルの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があります。

48
Chris Pratt