web-dev-qa-db-ja.com

Django staticfiles app help

Djangoの staticfiles app に少し問題があります。

私が追加しました

'Django.contrib.staticfiles',

私のINSTALLED_APPSに追加しました

STATIC_URL = '/static/'
STATIC_ROOT = '/Users/kevdotbadger/Django/mylook/static/'

settings.pyファイルに。

すべての静的ファイルは、MacのSTATIC_ROOTフォルダー内にあります。

今、私のテンプレート内で使用します

{{ STATIC_URL }}

/static/に正しくレンダリングされます。

しかしながら

{{ STATIC_URL }}css/style.css

404エラーが発生します。サーバーとして「runserver」コマンドを使用しています。

私が欠けているものはありますか?

41
dotty

こちらのハウツードキュメントをお読みください: http://docs.djangoproject.com/en/dev/howto/static-files/

要するに、STATIC_ROOTは、collectstatic manangementコマンドを呼び出す場合にのみ使用されます。静的ファイルを提供するために、ディレクトリをSTATICFILES_DIRS設定に追加する必要はありません!

開発中(自動検索ビューが使用されている場合)、静的ファイルはさまざまな場所で静的ファイルを自動的に検索します(静的ファイルへのパスを使用して「serv」ビューを呼び出すため)。この検索で​​は、「ファインダー」と呼ばれるものを使用します(STATICFILES_FINDERS設定で定義されています)。

  1. デフォルトのファインダの1つはAppDirectoriesFinderです。これは、INSTALLED_APPS設定の各アプリの「/ static /」ディレクトリを検索します。

  2. 別のデフォルトのFinderはFileSystemFinderで、STATICFILES_DIRS設定で指定したディレクトリを検索します。

ところで、これらの検索パターンは両方とも、テンプレートのロードの仕組みに似ています。

Collectstaticコマンドの実行時に同じ手法が使用されますが、さまざまな場所からファイルを収集し(上記と同じファインダーを使用)、見つかったファイルをSTATIC_ROOTに配置し、展開の準備が整います。

118
jezdez

開発中にプロジェクトのグローバルな静的ファイルを提供するための迅速で簡単な回避策を見つけました。

  • プロジェクトの静的ファイルを含む新しいアプリを起動します(例:「manage.py startapp static_content」)
  • そのアプリに「static」という名前のフォルダーを作成し、静的ファイルをそこに配置します。
  • インストールしたアプリのリストに新しいアプリを追加します
3
Markus Lenger

ソリューションだけが必要な場合は、「ソリューション」までスクロールします。

概要

昨日、同じ問題を発見していました。ここに私が見つけたものがあります:

必要なのは、STATIC_ROOTとそのすべてのコンテンツを見つける適切な静的Finderだけですが、そのようなFinderはありません。デフォルトのファインダーは次のとおりです。

  • Django.contrib.staticfiles.finders.AppDirectoriesFinder-インストールされた検索Djangoアプリケーションは 'static'フォルダを探しますが、それらのうち、現在は時代遅れの「メディア」フォルダを使用しています。

  • Django.contrib.staticfiles.finders.FileSystemFinder-STATICFILES_DIRSに記載されているすべてのディレクトリを使用しますが、STATIC_ROOTを追加することはできません。

  • Django.contrib.staticfiles.finders.DefaultStorageFinder-DEFAULT_FILE_STORAGE(Django.core.files)で静的検索します。 storage.FileSystemStorageデフォルトでは、MEDIA_ROOTを指します

解決

それだけです。追加の選択肢はありません。現時点では、STATIC_ROOTを使用する選択肢はありません(Django 1.3))。
したがって、私はこれらのニーズに合わせて独自のカスタムFinderを作成しました。

  • 私のカスタム静的Finderファイル:finders.py

    from Django.core.files.storage import FileSystemStorage
    from Django.contrib.staticfiles.finders import BaseStorageFinder
    from Django.conf import settings
    
    class StaticFinder(BaseStorageFinder):
        storage = FileSystemStorage(settings.STATIC_ROOT, settings.STATIC_URL)
    
  • settings.py

    STATICFILES_FINDERS = (
        'finders.StaticFinder',
    )
    
  • 別のファインダーで使用したい場合は、STATICFILES_FINDERS内に配置することをお勧めします

そして覚えておいてください:このソリューションは、開発のニーズにのみ使用し、本番環境では使用しないでください!

3
Rost
STATIC_ROOT = '/home/ws/be/bla/'
STATICFILES_DIRS = ('/home/ws/be/static/',)
STATIC_URL = '/static/'

これは私のために働く。 STATIC_ROOTはSTATICFILES_DIRSとは異なる必要があります(Djangoバージョン1.4プレアルファSVN-16436)

1
maruusos82

まず、urls.pyで static serve が有効になっていることを確認してください(開発のみ)。

また、そこに余分なスラッシュがあるかもしれません。 STATIC_URL == '/ static /'の場合、

{{STATIC_URL}}/css/style.cssは{{STATIC_URL}} css/style.cssでなければなりません。

1
C. Alan Zoppa