Django / UploadFileForm 仅提供无效表单?

-2 投票
1 回答
14 浏览
提问于 2025-04-12 23:56

我尝试用Django创建一个简单的文件上传功能,使用了以下代码和文件:

这些内容大致是从这个例子中拿来的:https://docs.djangoproject.com/en/5.0/topics/http/file-uploads/

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})

总体来看,表单看起来没问题,我可以选择文件:

在这里输入图片描述

但是当我输入一些内容时,它却不工作,日志中显示了以下内容:

[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出于某种原因是空的?为什么这没有按预期工作呢?

1 个回答

1

你忘了设置表单的 enctype="…" [mdn-doc] 属性,这样才能同时上传数据和文件:

<form method="post" enctype="multipart/form-data">
  {% csrf_token %}
  {{ form }}
</form>

撰写回答