2011-08-25 23 views
34

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

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

私はそれがSTATICFILES_FINDERSからdjango.contrib.staticfiles.finders.AppDirectoriesFinderを削除し、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。もちろん、手動で管理者を追加することもできますが、別のディレクトリ構造を持つ管理者を壊さずにこれを行う方法がわかりません。

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

答えて

39

これは、アプリケーション固有の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があります。

+0

私たちがnginxを使って静的なファイルを提供しているのなら、これは依然として好ましい方法ですか? (静的なファイルを保持、アプリケーション自体のテンプレート) – Dineshkumar

+0

うん。プロジェクトですべての資産を管理する必要があります。 –

関連する問題