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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:27:30