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
相关产品推荐
相关产品推荐

