Django使用Dropzone.js上传文件出现NoneType错误如何解决
问题根因
- Dropzone默认开启自动上传,文件拖入后会立刻发POST请求完成上传,你点击提交按钮时触发的第二次POST请求没有携带文件,导致
request.FILES.get('file')返回None,调用.name就触发了属性错误。你提到的图片路径能正常存入数据库,就是第一次自动上传时写入成功的结果。 - 你开启了文件多选,用
get('file')只能获取到第一个文件,无法处理多文件上传场景。 - 多余的FileSystemStorage调用:Django的ImageField本身会在模型实例保存时自动处理文件存储,你不需要手动调用FileSystemStorage存文件。
修复步骤
1. 修改前端Dropzone配置,关闭自动上传
首先给form标签添加id:
<form id="uploadDropzone" action="{% url 'document_upload' %}" method="POST" class="dropzone dz" role="form" enctype="multipart/form-data">
然后在HTML末尾添加Dropzone配置,禁用自动上传,绑定提交按钮触发上传,完成后跳转:
<script> Dropzone.options.uploadDropzone = { autoProcessQueue: false, // 关闭自动上传 uploadMultiple: true, // 支持多文件上传 parallelUploads: 10, // 最大并行上传数 maxFiles: 10, // 单次最多上传文件数 init: function () { const dropzone = this; // 绑定提交按钮点击事件 document.querySelector("#cf-submit").addEventListener("click", function (e) { e.preventDefault(); dropzone.processQueue(); // 手动触发上传队列 }); // 所有文件上传完成后跳转 this.on("queuecomplete", function () { // 替换为你要跳转的页面地址,比如上传成功页、文件列表页 window.location.href = "/upload-success/"; }); } }; </script>
2. 优化后端视图逻辑,加非空判断、支持多文件
修改views.py代码,移除多余的文件存储逻辑,加空值校验,上传完成后重定向避免表单重复提交:
from django.shortcuts import redirect def document_upload(request): c = main.objects.get(username=request.session['username']) unq_id = c.unq_id if request.method == 'POST': # 获取所有上传的文件 file_list = request.FILES.getlist('file') # 空文件校验,没有文件直接返回不执行后续逻辑 if not file_list: return render(request, 'Main/document_upload.html', {"msg": "请选择要上传的文件"}) # 循环处理所有文件 for file in file_list: Doc.objects.create(user_id=unq_id, upload=file) # 上传完成后重定向,不要返回render避免重复提交 return redirect("你要跳转的路由名称") return render(request, 'Main/document_upload.html')
可选优化
如果不需要多文件上传,只需要在Dropzone配置里把uploadMultiple设为false,后端继续用request.FILES.get('file')即可,同样要先判断返回值是否为None再执行后续操作。
内容的提问来源于stack exchange,提问作者tyzion
相关产品推荐
相关产品推荐

