使用Django 2.0.2开发Web应用遇ModuleNotFoundError问题求助
解决Django中ModuleNotFoundError: No module named 'myapp.views.hello'的问题
我来帮你捋捋这个问题,这种报错大概率是视图文件/目录的结构或者导入路径写错了,咱们一步步排查:
首先确认你的目录结构
先看看你的myapp下面是views.py文件,还是views目录?正确的基础结构应该是这样的:
你的项目根目录/ ├── 项目配置目录/ │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── myapp/ │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── models.py │ ├── views.py # 重点:这里是单个.py文件,不是目录! │ └── migrations/ │ └── __init__.py └── manage.py
情况1:你误把views.py改成了views目录
如果是为了拆分视图模块(比如把不同功能的视图放到不同文件里),那你需要:
- 在
myapp/views/目录下创建一个空的__init__.py文件——这是Python识别目录为“包”的标志,没有它,myapp.views就不是合法的包,自然没法导入子模块。 - 调整导入方式:
- 假设
myapp/views/hello.py里定义了hello视图函数,你可以在项目的urls.py里直接写:from myapp.views.hello import hello - 或者在
myapp/views/__init__.py里提前导入:
这样在from .hello import hellourls.py里就可以用更简洁的from myapp.views import hello来导入了。
- 假设
如果是不小心把views.py改成了目录,那直接把目录改回views.py文件,把里面的代码合并回去就行。
情况2:你的views.py是文件,但导入路径写错了
如果hello是views.py里定义的一个函数,那你之前写的from myapp.views.hello import ...是错误的——因为hello是函数,不是views下面的子模块。正确的导入应该是:
from myapp.views import hello
对应的urls.py配置应该是这样的:
from django.urls import path from myapp.views import hello urlpatterns = [ path('hello/', hello, name='hello'), ]
情况3:别忘了检查INSTALLED_APPS
虽然这个报错提示不是直接因为这个,但还是要确认settings.py里的INSTALLED_APPS已经添加了myapp:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'myapp', # 必须加上这个 ]
最后再验证一下
修改完之后,重启Django开发服务器,再访问对应的路由,应该就能解决这个问题了。
内容的提问来源于stack exchange,提问作者Ssukumar
相关产品推荐
相关产品推荐

