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

Django新手求助:单页面实现两个文件一键上传

嘿,我来帮你搞定Django里的双文件上传问题!既然你已经搞定了单文件上传,那扩展成双文件其实没那么复杂,我一步步给你拆解怎么改~

第一步:更新表单(如果用了Form/ModelForm)

如果你之前用的是Django的表单类,只要新增一个FileField就好:

# forms.py
from django import forms

class UploadTwoFilesForm(forms.Form):
    file1 = forms.FileField(label='第一个文件')
    file2 = forms.FileField(label='第二个文件')

要是你用的是ModelForm,那得先给模型加两个文件字段:

# models.py
from django.db import models

class UploadedFiles(models.Model):
    file1 = models.FileField(upload_to='uploads/')  # upload_to指定存储子目录
    file2 = models.FileField(upload_to='uploads/')

对应的ModelForm会自动包含这两个字段,不用额外修改。

第二步:修改你的views.py代码

基于你现有的代码,我们要处理两个文件的上传逻辑,注意要检查请求方法,并且确保正确读取request.FILES里的两个文件:

from __future__ import unicode_literals
from django.shortcuts import render
from django.conf import settings
from django.core.files.storage import FileSystemStorage
from .forms import UploadTwoFilesForm  # 导入刚才的表单类

def upload_two_files(request):
    if request.method == 'POST':
        # 把POST数据和FILES都传给表单
        form = UploadTwoFilesForm(request.POST, request.FILES)
        if form.is_valid():
            # 处理第一个文件
            file1 = request.FILES['file1']
            fs = FileSystemStorage()
            saved_filename1 = fs.save(file1.name, file1)
            file1_url = fs.url(saved_filename1)
            
            # 处理第二个文件,逻辑和第一个一致
            file2 = request.FILES['file2']
            saved_filename2 = fs.save(file2.name, file2)
            file2_url = fs.url(saved_filename2)
            
            # 要是用了模型,这里可以把文件保存到数据库
            # UploadedFiles.objects.create(file1=file1, file2=file2)
            
            # 返回成功页面,展示上传后的文件链接
            return render(request, 'upload_success.html', {
                'file1_url': file1_url,
                'file2_url': file2_url
            })
    else:
        form = UploadTwoFilesForm()
    
    # GET请求时返回表单页面
    return render(request, 'upload_form.html', {'form': form})

另外别忘了在settings.py里配置媒体文件路径(如果还没配置的话):

# settings.py
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

还要在项目的urls.py里加上媒体文件的访问路由:

from django.conf import settings
from django.conf.urls.static import static
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^upload/$', views.upload_two_files, name='upload_two_files'),
    # 你的其他路由...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
第三步:调整模板页面

模板里一定要加enctype="multipart/form-data",这是文件上传的关键,没有这个的话,request.FILES会是空的!

如果用表单渲染,模板可以这么写:

<!-- upload_form.html -->
<!DOCTYPE html>
<html>
<head>
    <title>上传两个文件</title>
</head>
<body>
    <h2>上传两个文件</h2>
    <form method="post" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">提交上传</button>
    </form>
</body>
</html>

要是你不想用表单类,手动写HTML的话,要确保两个文件输入框的name属性和视图里的键一致:

<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <div>
        <label>第一个文件:</label>
        <input type="file" name="file1">
    </div>
    <div>
        <label>第二个文件:</label>
        <input type="file" name="file2">
    </div>
    <button type="submit">提交上传</button>
</form>
新手容易踩的坑
  • 没加enctype="multipart/form-data":这是最常见的错误,直接导致文件传不上去。
  • 媒体文件路径配置错误:要确保MEDIA_ROOT对应的文件夹存在,并且服务器有读写权限。
  • 表单字段名和视图里的键不匹配:比如表单里叫my_file1,视图里却取request.FILES['file1'],这样会找不到文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:00:12