14

django アプリを「apps」サブディレクトリに入れることについて質問があります。project_root に「faktura」というアプリがあります。そこにあるという事実が気に入らなかったので、すべてのアプリを「apps」サブディレクトリに保存したいと考えています。

そこで、python パスを「apps」サブディレクトリに拡張できることがわかったので、インターネットで調べた後、次の文字列を settings.py に追加しました: sys.path.insert(0, os.path.join(PROJECT_PATH, "アプリ」)))。次に、アプリを「faktura」のように INSTALLED_APPS に追加しました。ルートの urls.py に url(r'^faktura/', include('faktura.urls')) を追加するまで、すべてがスムーズに機能しました。それ以来、Django は「No module named faktura」というエラー メッセージをスローします

なぜ urls.py だけがアプリを見つけられないのでしょうか? また、PATH に追加した場合、このアプリを見つけることができませんか? 午前中、何が問題なのかを突き止めようとしましたが、今はあなたの助けが必要です。

4

4 に答える 4

23

修正できる冗長な行がいくつかあることを除けば、前の回答が -1 になった理由はわかりません。とにかく、Python パスに何も追加しない、少し異なる方法を見つけました。

これが最終的なディレクトリ構造です。後で説明します。

mysite
├── mysite
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── apps
│   ├── __init__.py
│   └── myfirstapp
│       ├── __init__.py
│       ├── admin.py
│       ├── models.py
│       ├── tests.py
│       └── views.py
└── manage.py

プロジェクトを作成したばかりでも、アプリを移動したい場合でも、アプリをapps格納するサブディレクトリを作成してください。トリックは、__init__.pyそのディレクトリに を追加することです。

mkdir apps
touch apps/__init__.py

これで、既存のアプリをサブディレクトリに移動できますapps。代わりに新しいものを作成したい場合は、次のコマンドがあります。

python manage.py mysecondapp
mv mysecondapp apps/

警告: 電話をかけようとしないでくださいpython manage.py ./apps/mysecondapp。何らかの理由で、これによりそのディレクトリ内の他のすべてのアプリが削除されます。私はこの方法で 1 日仕事を失いました。

次に、いくつかのインポートを修正する必要があります。あなたのsettings.pyプレフィックスは次のappsとおりです。

INSTALLED_APPS = (
    ...
    'apps.myfirstapp',
    'apps.mysecondapp'
)

urls.py最後に、プロジェクトを prefixに修正しますapps:

urlpatterns = patterns('', 
  url(r'^myfirstapp', include('apps.myfirstapp.urls')),
  ...
)

記述方法によっては、アプリ内でいくつかのインポートを修正する必要がある場合もあります。を使用するfrom models import MyFirstModelか、プレフィックスを使用してfrom apps.myfirstapp.models import MyFirstModelください。

つまり、apps( を追加して) ディレクトリを python パッケージに__init__.pyすると、それをインポート パスの一部として使用できます。これは、展開方法に関係なく、追加の構成なしで機能するはずです。

于 2014-01-26T10:01:44.283 に答える
1

Django アプリケーションをサブフォルダー (apps/ など) に保持するには、最初に以下を settings.py に追加します。

import os

PROJECT_ROOT = os.path.dirname(__file__)

次に、manage.py で:

#!/usr/bin/env のすぐ下に python を追加:

import sys

from os.path import abspath, dirname, join

from site import addsitedir

if __name__ == "__main__" の直前に : 追加:

sys.path.insert(0, join(settings.PROJECT_ROOT, "apps"))

于 2012-04-25T10:24:48.060 に答える
0

@Radu Gheorghiuの答え; settings.py を編集する必要はなく、パスの挿入行は 1 行のコードに要約できます。

sys.path.insert(0, os.path.join(os.path.dirname(__file__), "apps"))

この回答はhttp://obroll.com/nested-application-inside-apps-sub-folder-in-django-1-3/から入手しました

于 2014-07-03T06:08:21.777 に答える