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

Django中使用jQuery+FormData上传文件失败问题求助

排查Django UpdateView中FormData上传文件丢失的问题

我之前也碰到过类似的情况,结合你的代码来看,主要有几个关键点需要排查,咱们一步步来:

1. 你找错了文件数据的存储位置!

这是最容易踩的坑:Django中上传的文件不会出现在request.POST里,而是存在request.FILES对象中。你在views里打印request.POST自然看不到文件,赶紧改成打印request.FILES试试,大概率能看到你上传的文件了。

修改后的views.py代码:

class SowiUpdateView(UserPassesTestMixin, LoginRequiredMixin, UpdateView):
    def post(self, request, *args, **kwargs):
        print(request.POST)  # 这里是普通表单字段数据
        print(request.FILES)  # 这里才是文件数据!
        return super(SowiUpdateView, self).post(request, *args, **kwargs)

2. 多文件上传的FormData键名需要加[]

当你要上传多个文件时,FormData的键名需要用files[]而不是files,这样Django才能识别这是一个文件列表。如果只用files,后面的文件会覆盖前面的,最后可能只留下一个,甚至识别失败。

修改你的JavaScript代码:

var formData = new FormData(document.getElementById("form_id"));
for (var i = 0, len = filesToUpload.length; i < len; i++) {
    const file = filesToUpload[i].file;
    // 先确认是有效的File对象,避免追加无效数据
    if (file instanceof File) {
        formData.append("files[]", file);
    } else {
        console.warn("跳过无效的文件对象:", file);
    }
}

3. 确保ModelForm支持多文件上传

你的ModelForm对应的字段需要用MultipleFileField(Django 3.0及以上版本支持),这样才能正确接收多个上传的文件。比如:

from django import forms
from .models import YourModel  # 替换成你的模型类

class SowiForm(forms.ModelForm):
    # 定义多文件字段,required=False表示可选
    files = forms.MultipleFileField(required=False)

    class Meta:
        model = YourModel
        fields = ['your_other_fields', 'files']  # 包含其他需要的字段

同时别忘了在UpdateView里指定这个form_class:

class SowiUpdateView(UserPassesTestMixin, LoginRequiredMixin, UpdateView):
    model = YourModel
    form_class = SowiForm  # 关联你的ModelForm
    # 其他配置比如template_name等

4. 额外检查:确认文件对象的有效性

有时候filesToUpload[i].file可能不是真正的File对象(比如误存成了文件路径字符串),所以在append前加个类型判断很有必要,就像上面JS代码里做的那样,避免无效数据干扰。

按照这几步调整后,你应该能在request.FILES里看到上传的文件了。如果还有问题,可以再检查下表单的enctype属性(虽然用FormData+contentType: false不需要,但原始表单加上enctype="multipart/form-data"更稳妥)。

内容的提问来源于stack exchange,提问作者Sarius

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 08:37:39