Django导入views模块报错:相对导入无已知父包
解决Django中
ImportError: attempted relative import with no known parent package的问题 这问题我刚入门Django的时候也踩过一模一样的坑!咱们一步步拆解原因和解决办法:
错误核心原因
你用的from . import views是相对导入语法,它只能在被Python识别为「包」的目录里使用。如果你的urls.py所在目录不符合以下任一条件,就会触发这个错误:
- 目录里没有
__init__.py文件(Python3.3+支持隐式包,但Django场景下建议显式创建) - 该目录不在Python的
sys.path搜索路径中 - 你直接运行了
urls.py文件(脱离了Django项目的上下文环境)
具体解决办法
1. 先核对你的项目结构是否正确
标准Django项目的目录结构应该是这样的:
my_django_project/ my_django_project/ # 项目根配置目录 __init__.py settings.py urls.py # 全局路由文件,不能用相对导入 my_app/ # 你的业务应用目录 __init__.py # 空文件即可,必须存在 urls.py # 应用级路由,这里用相对导入才正确 views.py models.py
- 如果你的
urls.py是应用目录下的路由文件:那你的代码from . import views完全正确,只需确保这个应用已经加到settings.py的INSTALLED_APPS列表里。 - 如果你的
urls.py是项目根目录下的全局路由:不能用相对导入,要改成绝对导入,示例如下:from django.urls import path from my_app import views # 把my_app替换成你的实际应用名称 urlpatterns = [ path('', views.home, name='home'), ]
2. 绝对不要直接运行urls.py文件
很多新手会犯这个错:直接用python urls.py测试代码。但Django的模块必须在项目上下文环境中运行,直接运行会让Python无法识别这个文件所属的包。正确的启动方式是在项目根目录下执行:
python manage.py runserver
3. 确保应用目录里有__init__.py
即使Python3支持隐式命名空间包,在Django中最好还是在每个应用目录下创建一个空的__init__.py文件,明确告诉Python这是一个可导入的包。
内容的提问来源于stack exchange,提问作者Marwane Elalama
相关产品推荐
相关产品推荐

