You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 09:55:13