我希望所有应用程序都在同一个共享的应用程序文件夹中。但是django设置不希望看到创建的应用程序。
我是如何创建应用的
- 在项目根目录中创建了一个空的应用程序文件夹
- 在其中创建了一个空的
__init__.py
文件 - 在应用程序文件夹中创建了一个空文件夹-
creative_performer
- 运行命令
python manage.py startapp creative_performer apps/creative_performer
得到以下结构
/gpanel
/projects
urls.py
settings.py
....
/apps
__init__.py
/creative_performer
/migrations
__init__.py
apps.py
models.py
....
管理员.py
设置.py
PROJECT_APPS = ['creative_performer']
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
] + PROJECT_APPS
但在服务器运行后得到
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 1004, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'creative_performer'
我还尝试过用命令创建一个应用程序
django-admin startapp creative_performer
相同的结果
如果在项目的根目录中创建一个应用程序,而不使用apps
共享文件夹,则所有内容都开始工作
其他尝试将PROJECT_APPS
更改为PROJECT_APPS = ['apps.creative_performer']
但得到
django.core.exceptions.ImproperlyConfigured: Cannot import 'creative_performer'. Check that 'apps.creative_performer.apps.CreativePerformerConfig.name' is correct.
但是CreativePerformerConfig.name == 'creative_performer'
,不清楚为什么会出现错误
p.S.
通过更改apps.py
更改name = 'apps.creative_performer'
解决
和设置.py
PROJECT_APPS = ['apps.creative_performer']
但是,这是姜戈的正常行为吗?如果不更改默认设置,在共享文件夹中创建应用程序真的不可能吗?
installed_apps
使用Python的普通导入系统来定位已安装的应用程序。归根结底,重要的是:你的应用程序可以被定位和导入,这遵循python打包和导入语义。因此,对于您通过pip
安装的大多数第三方应用程序,PYTHONPATH上已经可以作为顶级名称导入。
因为你的应用程序creative_performer
实际上是apps
下的一个子包,所以你需要在installed_apps
中使用'apps.creative_performer'
,并将应用程序名称设置为相同才能在这种情况下使用它。
另一种选择是删除apps/__init__.py
文件,并将apps
目录添加到PYTHONPATH环境变量中(或修改sys.path
(来处理此问题。这样,你的应用程序只是独立的软件包。但正确的做法可能是将其保留在'apps.creative_performer'
中——例如,这与django在其contrib
子包中所做的类似。一般来说,不鼓励修改你的蟒蛇路径。
另一种选择是将你的应用程序作为可重复使用的应用程序分发,并单独安装。