Django项目中views.py无法保存提交的CSV文件至应用data文件夹的问题
Django文件上传无法保存到指定目录的排查与修复
以下是针对代码问题的具体排查点和修复方案:
核心问题1:视图逻辑未被触发
你的CsvPlot类继承自View,但存在两个关键问题导致上传逻辑根本没执行:
- HTML表单的
action="/"指向根路径,但urls.py中视图映射的是/csv-plot/,表单提交后并未进入CsvPlot视图处理。 View类不会自动执行自定义的save_uploaded_file方法,必须重写post方法来接收并处理POST请求。
核心问题2:文件保存逻辑无效
你先用FileSystemStorage()默认保存了文件(默认存在MEDIA_ROOT目录),之后手动拼接data文件夹路径,但这一步仅生成了路径字符串,并没有把文件真正写入到目标data文件夹,等于做了无用功。
核心问题3:错误反馈失效
save_uploaded_file中的return HttpResponse不会生效,因为该方法的返回值没有被上层请求处理方法(如post)返回,前端无法收到错误提示。
修复后的代码示例
1. 修改views.py
重写post方法直接处理上传逻辑,同时指定FileSystemStorage的存储路径到目标文件夹:
from django.views import View from django.http import HttpResponse from django.conf import settings from django.core.files.storage import FileSystemStorage import os class CsvPlot(View): def post(self, request): if 'document' not in request.FILES: return HttpResponse('请选择要上传的文件') uploaded_file = request.FILES['document'] if not uploaded_file.name.endswith('.csv'): return HttpResponse('无效文件类型,仅支持CSV格式') # 配置目标存储目录 target_dir = settings.BASE_DIR / 'ml_in_geotech' / 'data' if not os.path.exists(target_dir): os.makedirs(target_dir) # 直接指定目录保存文件 storage = FileSystemStorage(location=target_dir) saved_name = storage.save(uploaded_file.name, uploaded_file) file_path = os.path.join(target_dir, saved_name) # 后续业务逻辑:读取文件、存入session等 # self.readfile(request, file_path) request.session['file_path'] = file_path return HttpResponse('文件上传成功')
2. 修改HTML表单的action
使用Django的url标签指向正确视图路径,避免硬编码:
<div class="upload_file"> <h2>Train Your Data</h2> <form method="POST" enctype="multipart/form-data" action="{% url 'csv_plot' %}"> {% csrf_token %} <input type="file" name="document" id="document" required="required"> <button type="submit">Submit</button> </form> {% block messages %} {% if messages %} <div class="container" style="color: firebrick; margin-top: 20px" > {% for message in messages %} {{ message }} {% endfor %} </div> {% endif %} {% endblock %} </div>
3. 确认urls.py配置
确保路由配置正确(若为应用内路由,需在项目根urls中包含该应用路由):
from django.urls import path from . import views urlpatterns = [ path('csv-plot/', views.CsvPlot.as_view(), name='csv_plot'), ]
额外检查点
- 确认
ml_in_geotech/data目录的读写权限,Django运行用户需要具备该目录的写入权限。 - 若项目配置了
MEDIA_ROOT,本次修复直接指定存储路径,不受MEDIA_ROOT影响。
内容的提问来源于stack exchange,提问作者Codeholic
相关产品推荐
相关产品推荐

