Django:无法导入'模块'。检查模块AppConfig.name是否正确

时间:2017-09-12 13:17:02

标签: python django python-3.x

可能看起来像一个已经回答的问题,实际上here你有同样的问题(有点)我有。我的问题是,它只是一个技巧,一条线,没有解释(但它仍然不同,但给出的解决方案是有效的,这是我的问题的一部分)。 这是我的项目结构,简化:

manage.py
compfactu/---settings.py
          |--__init__.py
          |--core/--------__init__.py
                         |-apps.py  

以下是我在INSTALLED_APPS中添加应用的方式:

apps.py

from django.apps import AppConfig


class CoreConfig(AppConfig):
    name = 'core'

settings.py

INSTALLED_APPS = [ 
    ...
    #compfactu modules
    'compfactu.core.apps.CoreConfig',
]

当我阅读django 1.11文档时,我引用:

  

新应用程序应避免使用default_app_config。相反,他们应该要求在INSTALLED_APPS中明确配置相应AppConfig子类的虚线路径。

很好,它是一个新的应用程序所以我应该这样做:但我得到一个错误。它不是pythonpath的问题,因为我只是打开了一个python shell而且我可以毫无问题地执行from compfactu.core.apps import CoreConfig(也打印sys.path,一切都很好)。

但我有这个错误,这里有一个完整的追溯:

Traceback (most recent call last):
  File "/home/jbjaillet/Projets/venvcompfactu/lib/python3.5/site-packages/django/apps/config.py", line 147, in create
    app_module = import_module(app_name)
  File "/home/jbjaillet/Projets/venvcompfactu/lib/python3.5/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 956, in _find_and_load_unlocked
ImportError: No module named 'core'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/jbjaillet/Projets/venvcompfactu/lib/python3.5/site-packages/django/utils/autoreload.py", line 228, in wrapper
    fn(*args, **kwargs)
  File "/home/jbjaillet/Projets/venvcompfactu/lib/python3.5/site-packages/django/core/management/commands/runserver.py", line 117, in inner_run
    autoreload.raise_last_exception()
  File "/home/jbjaillet/Projets/venvcompfactu/lib/python3.5/site-packages/django/utils/autoreload.py", line 251, in raise_last_exception
    six.reraise(*_exception)
  File "/home/jbjaillet/Projets/venvcompfactu/lib/python3.5/site-packages/django/utils/six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "/home/jbjaillet/Projets/venvcompfactu/lib/python3.5/site-packages/django/utils/autoreload.py", line 228, in wrapper
    fn(*args, **kwargs)
  File "/home/jbjaillet/Projets/venvcompfactu/lib/python3.5/site-packages/django/__init__.py", line 27, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/home/jbjaillet/Projets/venvcompfactu/lib/python3.5/site-packages/django/apps/registry.py", line 85, in populate
    app_config = AppConfig.create(entry)
  File "/home/jbjaillet/Projets/venvcompfactu/lib/python3.5/site-packages/django/apps/config.py", line 151, in create
    app_name, mod_path, cls_name,
django.core.exceptions.ImproperlyConfigured: Cannot import 'core'. Check that 'compfactu.core.apps.CoreConfig.name' is correct.

从那里开始,所有文件和类都由django(manage.py startapp)生成。 当我在上面提到的问题中实际上做了什么时,就像这样做:

INSTALLED_APPS = [ 
    ...
    #compfactu modules
    'compfactu.core',
]

它有效!我不明白这一点!阅读文档(我刚刚引用的部分),它应该不起作用(注意我的default_app_config中没有__init__.py

所以,作为我发现&#34;技巧的问题&#34;但是没有解释,我在这里问为什么它不应该以这种方式工作,以及为什么官方文档中的解决方案不起作用?&/ p>

提前感谢您的时间。

1 个答案:

答案 0 :(得分:12)

根据文档,AppConfig.name是应用程序的完整python路径。

  

AppConfig.name

     

应用程序的完整Python路径,例如的 'django.contrib.admin'

     

此属性定义配置适用的应用程序。   必须在所有 AppConfig 子类中设置它。

     

它在Django项目中必须是唯一的。

https://docs.djangoproject.com/en/2.2/ref/applications/#django.apps.AppConfig.name

试试这个:

class CoreConfig(AppConfig):
    name = 'compfactu.core'