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

Django文件上传:如何获取原文件名填充SourceFile.file字段

Django文件上传获取原文件名并填充模型字段解决方案

问题根源分析

  1. 直接用SourceFile模型实例化表单是错误操作,需使用ModelForm处理表单逻辑
  2. request.POST是不可变QueryDict,无法直接赋值修改
  3. ViewSet中自定义方法签名错误,且未使用@action装饰器注册路由
  4. FileField的upload_to参数无需加开头斜杠,Django会基于MEDIA_ROOT自动处理路径

修正后的代码实现

1. 模型文件(models.py)

from django.db import models

class SourceFile(models.Model):
    file = models.CharField(max_length=255)  # 存储文件原名称
    uploaded_to = models.FileField(upload_to='uploads/')  # 存储文件上传路径

2. 表单文件(新增forms.py)

from django import forms
from .models import SourceFile

class SourceFileForm(forms.ModelForm):
    class Meta:
        model = SourceFile
        fields = ['uploaded_to']  # 仅暴露上传字段,原名称后台自动填充

3. 视图文件(views.py)

from rest_framework import viewsets
from rest_framework.decorators import action
from django.shortcuts import render, redirect
from .models import SourceFile
from .forms import SourceFileForm
from .serializers import SourceFileSerializer

class SourceFileViewSet(viewsets.ModelViewSet):
    serializer_class = SourceFileSerializer
    queryset = SourceFile.objects.all()  # ModelViewSet必须指定查询集

    def list(self, request):
        return Response("GET API")        

    @action(detail=False, methods=['get', 'post'])  # 注册非详情上传接口
    def upload_file(self, request):
        if request.method == "POST":
            form = SourceFileForm(request.POST, request.FILES)
            if form.is_valid():
                # 先创建模型实例但不保存到数据库
                source_file = form.save(commit=False)
                # 从上传文件中提取原名称并赋值
                source_file.file = request.FILES['uploaded_to'].name
                source_file.save()  # 最终保存完整数据
                return redirect("/success/url/")
        else:
            form = SourceFileForm()
        return render(request, "upload.html", {"form": form})

关键配置补充

在settings.py中配置媒体文件路径:

MEDIA_ROOT = BASE_DIR / 'uploads'
MEDIA_URL = '/media/'

在项目根urls.py中添加开发环境媒体文件路由:

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

urlpatterns = [
    # 已存在的路由配置
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 13:33:26