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

Django UploadFileForm表单无效,request.FILES为空问题排查

问题

参考Django文档实现文件上传功能,代码如下:

forms.py

from django import forms
class UploadFileForm(forms.Form):
    title = forms.CharField(max_length=50)
    file = forms.FileField()

views.py

from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import UploadFileForm
import os
import sys

def handle_uploaded_file(f):
    path = os.path.abspath(os.path.dirname(sys.argv[0]))     
    fnFile = os.path.join(path, "gpp", "FILES", "QUESTIONS", "someFile.xyz")    
    print(fnFile)
    with open(fnFile, 'wb+') as destination:
        for chunk in f.chunks():
            destination.write(chunk)

def home(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        print(request.POST)
        print(request.FILES)
        if form.is_valid():
            print(f"Valid form")
            handle_uploaded_file(request.FILES['file'])
            return HttpResponseRedirect('/success/url/')
        else:
            print("No valid form")
    else:
        form = UploadFileForm()
    return render(request, 'home.html', {'form': form})

表单前端显示正常,可选择文件,但提交后request.FILES为空,表单验证失败,日志如下:

[23/Mar/2024 10:02:35] "GET / HTTP/1.1" 200 1777
<QueryDict: {'csrfmiddlewaretoken': ['HWaddf1sBsKJc1k4CY9LiijIv1VAlxjWkRoFRixEP12rNDYyIx6zRYFC2MvPKIFm'], 'title': ['Test'], 'file': ['gpt.zip'], 'save': ['']}>
<MultiValueDict: {}>
No valid form
[23/Mar/2024 10:04:33] "POST / HTTP/1.1" 200 1869

请问为何request.FILES为空,表单无法正常验证?


解决方法

  • 核心原因:HTML表单缺少enctype="multipart/form-data"属性,这是Django接收上传文件的必要条件。没有该属性时,浏览器仅会把文件名作为普通表单字段提交,不会传递文件内容,直接导致request.FILES为空。

  • 修复步骤:

    1. 修改前端模板home.html中的表单标签,添加enctype="multipart/form-data"属性:
      <form method="post" enctype="multipart/form-data">
          {% csrf_token %}
          {{ form.as_p }}
          <button type="submit">上传</button>
      </form>
      
    2. 确认表单的method属性为post,这是文件上传的强制要求。
  • 额外检查:如果是手动渲染表单字段而非使用form.as_p,需确保文件对应的<input>标签类型为file,Django的FileField默认会生成正确标签,但手动编写时需留意。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 04:31:06