2016-08-19 38 views
1

我有规范形式的Django项目:虚线路径无法导入

 
. 
├── app1/ 
├── app2/ 
├── ... 
├── project/ 
└── manage.py 

与所有已经开始增加了额外的文件夹是不是应用程序(例如,文档)它是越来越难保持它组织,所以我决定把像这样:

 
. 
├── modules/ 
│ ├── __init__.py 
│   ├── app1/ 
│   └── app2/ 
├── project/ 
└── manage.py 

但是,我不能,我的生活,找出如何引用在我的settings.py INSTALLED_APPS的应用程序。更改

 
INSTALLED_APPS = [ 
    ... 
    'app1.apps.App1Config' --> 'modules.app1.apps.App1Config' 
    'app2.apps.App2Config' --> 'modules.app2.apps.App1Config' 
] 

将产生上./manage.py的runserver的神秘回溯(/路径/到/ VENV /为了简洁)

 
    Traceback (most recent call last): 
     File "/path/to/venv/lib/python3.5/site-packages/django/utils/autoreload.py", line 226, in wrapper 
     fn(*args, **kwargs) 
     File "/path/to/venv/lib/python3.5/site-packages/django/core/management/commands/runserver.py", line 113, in inner_run 
     autoreload.raise_last_exception() 
     File "/path/to/venv/lib/python3.5/site-packages/django/utils/autoreload.py", line 249, in raise_last_exception 
     six.reraise(*_exception) 
     File "/path/to/venv/lib/python3.5/site-packages/django/utils/six.py", line 685, in reraise 
     raise value.with_traceback(tb) 
     File "/path/to/venv/lib/python3.5/site-packages/django/utils/autoreload.py", line 226, in wrapper 
     fn(*args, **kwargs) 
     File "/path/to/venv/lib/python3.5/site-packages/django/__init__.py", line 27, in setup 
     apps.populate(settings.INSTALLED_APPS) 
     File "/path/to/venv/lib/python3.5/site-packages/django/apps/registry.py", line 85, in populate 
     app_config = AppConfig.create(entry) 
     File "/path/to/venv/lib/python3.5/site-packages/django/apps/config.py", line 142, in create 
     app_module = import_module(app_name) 
     File "/path/to/venv/lib/python3.5/importlib/__init__.py", line 126, in import_module 
     return _bootstrap._gcd_import(name[level:], package, level) 
     File "", line 986, in _gcd_import 
     File "", line 969, in _find_and_load 
     File "", line 956, in _find_and_load_unlocked 
    ImportError: No module named 'app1' 

奇怪的是,如果我从INSTALLED_APPS删除,该项目将(几乎没有)工作。例如,请求被汇集到它们各自的urls.py,视图被渲染等。

我已经尝试创建一个新的干净的虚拟环境,只有Django 1.10运行在Python 3.5上的空新项目,但我无法想象它出。 (是的,我有__init__.py任何地方)

我错过了什么?

+0

我创建了一个类似的项目结构。 'modules.app1'适用于我。 – dunder

+0

@dunder你是对的;如果我将“modules.app1.apps.App1Config”更改为“modules.app1”,它将起作用。但是文档明确指出,应该指定AppConfig子类的虚线路径 –

+0

知道了!今天学到了一些新东西.. – dunder

回答

2

以及更新INSTALLED_APPS,您需要更新AppConfig.name属性以使用新路径。例如:

class App1Config(AppConfig): 
    name = 'modules.app1' 
    ...