Django FileField实现:按不同表单将文件保存至不同目录
实现不同表单上传文件到指定目录
步骤1:修改前端表单,添加标识字段
给两个表单添加区分标识,同时修正重复的ID:
<!DOCTYPE html> {% load static %} <body> <div class="page_secondblock secondblock"> <div class="secondblock__container _container"> <h1 class="secondblock__title"> 需更新的文件: </h1> <h2 class="secondblock__title"> 需获取信息的文件: </h2> </div> </div> <div class="page_thirdblock thirdblock"> <div class="thirdblock__container _container"> <form method="POST" enctype="multipart/form-data" class="upload1" id="upload_container1"> {% csrf_token %} {{form.as_p}} <!-- 隐藏字段标记表单类型 --> <input type="hidden" name="form_type" value="form1"> <input type="submit" value="提交"> </form> <form method="POST" enctype="multipart/form-data" class="upload2" id="upload_container2"> {% csrf_token %} {{form.as_p}} <input type="hidden" name="form_type" value="form2"> <input type="submit" value="提交"> </form> </div> </div> </body>
步骤2:更新模型,添加表单类型字段并设置动态上传路径
修改models.py,新增字段记录表单来源,同时让文件上传路径动态生成:
from django.db import models def get_upload_path(instance, filename): # 根据表单类型返回对应存储目录 if instance.form_type == 'form1': return 'folder_file_1/' + filename elif instance.form_type == 'form2': return 'folder_file_2/' + filename # 默认 fallback 路径 return 'default/' + filename class UploadFile(models.Model): FORM_TYPES = ( ('form1', '表单1'), ('form2', '表单2'), ) form_type = models.CharField(max_length=10, choices=FORM_TYPES) file = models.FileField(upload_to=get_upload_path)
步骤3:调整表单,隐藏类型字段(可选)
修改forms.py,将form_type设为隐藏字段,避免用户手动修改:
from django import forms from .models import UploadFile class UploadFileForm(forms.ModelForm): class Meta: model = UploadFile fields = ['file', 'form_type'] widgets = { 'form_type': forms.HiddenInput(), }
步骤4:修改视图,处理表单类型并保存
更新views.py的upload_file函数,获取表单标识并赋值给实例后保存:
from django.shortcuts import render from django.http import HttpResponseRedirect from .forms import UploadFileForm def index(request): return render(request, "index.html") def tools(request): return render(request, "index.html") def login(request): return render(request, "index.html") def upload_file(request): if request.method == 'POST': # 获取前端传来的表单类型 form_type = request.POST.get('form_type') form = UploadFileForm(request.POST, request.FILES) if form.is_valid(): # 先暂存实例,设置类型后再提交到数据库 instance = form.save(commit=False) instance.form_type = form_type instance.save() return HttpResponseRedirect('home') else: form = UploadFileForm() context = { 'form': form, } return render(request, 'index.html', context)
步骤5:执行数据库迁移
修改模型后需更新数据库:
python manage.py makemigrations python manage.py migrate
完成以上设置后,通过第一个表单上传的文件会保存到media/folder_file_1/目录,第二个表单的文件会保存到media/folder_file_2/目录。
内容的提问来源于stack exchange,提问作者macder
相关产品推荐
相关产品推荐

