49

私は多くのアプリケーションで構成されるDjango(1.3)プロジェクトを開発しています。static各アプリケーションには、独自のディレクトリの下に独自の静的ファイルがあります。project_staticさらに、 jQueryなどのさまざまなアプリケーションに共通する静的ファイルを含むディレクトリを追加しました。

私がすぐに遭遇する問題は、名前の衝突の問題です。デフォルトでは、アプリケーションで分類せずにcollectstatic、すべてをグローバルディレクトリの下に配置します。static各アプリケーションには(たとえば)というファイルがあるため、これは私には機能しませんcss/screen.css

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

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

4

1 に答える 1

58

これは、アプリ固有のtemplatesディレクトリを使用する場合に発生する問題と同じです。アプリの直下にファイルを投げるだけでtemplatesは、2 つのアプリまたはプロジェクト レベルのtemplatesディレクトリでさえ同じ名前のテンプレートを使用すると、名前の競合が発生します。そのための修正は、実際に次のtemplatesようなディレクトリ内の app の名前のディレクトリにテンプレートを配置することです。

- some_app
    - templates
        - some_app
            - index.html

したがって、同じ考え方を static に適用します。

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

そうすることで、collectstatic を実行すると、個々のアプリの静的ファイルが名前空間付きのディレクトリ内に配置されます。必要な唯一の変更は、テンプレート内の app-name ディレクトリを各ファイルのプレフィックスにすることです。だからあなたの代わりに{{ STATIC_URL }}css/style.css持ってい{{ STATIC_URL }}my_app/css/style.cssます。

于 2011-12-29T22:16:25.247 に答える