Django导入自定义模块报ModuleNotFoundError,求正确导入方法
解决Django视图中导入自定义模块的问题
这个问题我之前也碰到过,核心原因是Django运行服务器时的工作目录和你在Spyder里的工作目录不一致,导致你用相对路径添加sys.path的方式失效了。下面给你几个可行的解决方案:
方法1:将code文件夹转为Python包(推荐)
这是最符合Python和Django规范的做法,步骤很简单:
- 在
myapp/code文件夹下创建一个空的__init__.py文件,这样Python就会把code识别为一个可导入的包。 - 然后在
views.py里直接用绝对或相对导入:
from django.shortcuts import render from django.views import View # 相对导入(推荐,和当前文件同属myapp包) from .code import examplee as expl # 或者绝对导入(基于项目根目录) # from myapp.code import examplee as expl class CmtGraphTool(View): def get(self, request, *args, **kwargs): item_list = expl.test1() # 尽量别用list当变量名,这是Python内置类型 context = {'item_list': item_list} # 你之前的context写法有误,需为键值对字典 return render(request, "cmtgraphtool.html", context)
这样不管Django从哪个目录启动,都能正确找到模块,而且项目结构更清晰规范。
方法2:使用绝对路径添加sys.path
如果你暂时不想把code转为包,可以通过os模块获取views.py的绝对路径,再拼接code文件夹的路径,确保sys.path添加的是正确的目录:
from django.shortcuts import render from django.views import View import os import sys # 获取当前views.py文件的绝对目录 current_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接code文件夹的绝对路径 code_dir = os.path.join(current_dir, 'code') sys.path.append(code_dir) import examplee as expl class CmtGraphTool(View): def get(self, request, *args, **kwargs): item_list = expl.test1() context = {'item_list': item_list} return render(request, "cmtgraphtool.html", context)
为什么Spyder能识别但Django不行?
Spyder默认的工作目录通常是你当前打开的文件所在的目录(也就是myapp目录),所以./code指向的是myapp/code,能找到模块;但运行python manage.py runserver时,工作目录是项目的根目录(包含manage.py的那个目录),这时候./code会指向项目根下的code文件夹,而你这个文件夹是在myapp里的,所以就会出现ModuleNotFoundError。
内容的提问来源于stack exchange,提问作者Jack123321
相关产品推荐
相关产品推荐

