可能看起来像一个已经回答的问题,实际上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>
提前感谢您的时间。
答案 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'