Django settings.py文件中的INSTALLED_APPS中添加自定义子应用时,需要将子应用所在目录加入导报路径sys.path(如果子应用本身就在项目根路径下就不需要)。要么就要设置子应用的配置类的name值带上导包路径。
Django目录结构: test_project ├── LICENSE ├── main.py └── test_django ├── db.sqlite3 ├── manage.py └── test_django ├── apps │ └── app1 │ ├── admin.py │ ├── apps.py │ ├── __init__.py │ ├── migrations │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ └── views.py ├── asgi.py ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py
执行命令: /home/ubuntu/PycharmProjects/test_project/test_django/manage.py runserver
django.core.exceptions.ImproperlyConfigured: Cannot import 'app1'. Check that 'test_django.apps.app1.apps.App1Config.name' is correct.
以下是引起报错的源码:(位于*\site-packages\django\apps\config.py)
if app_name is None: try: app_name = app_config_class.name except AttributeError: raise ImproperlyConfigured( "'%s' must supply a name attribute." % entry ) # Ensure app_name points to a valid module. try: app_module = import_module(app_name) except ImportError: raise ImproperlyConfigured( "Cannot import '%s'. Check that '%s.%s.name' is correct." % ( app_name, app_config_class.__module__, app_config_class.__qualname__, ) )
上面的app_config_class就是应用内的apps.py中的Config类,这段程序实际上会以该类的name属性作为导包路径进行导包,因此如果这个name显示的路径与sys.path脱离的话就会报错ImproerlyConfigured。
有两种:
# 写在项目settings.py文件中即可 # 添加导包路径 import sys import os sys.path.insert(0, os.path.join(BASE_DIR, 'test_django/apps'))
# 注册子应用 # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app1' ]
# test_django/test_django/apps/app1/apps.py from django.apps import AppConfig class App1Config(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'test_django.apps.app1'
# 注册子应用 # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'test_django.apps.app1' ]