Django文件上传:如何获取原文件名填充SourceFile.file字段
Django文件上传获取原文件名并填充模型字段解决方案
问题根源分析
- 直接用
SourceFile模型实例化表单是错误操作,需使用ModelForm处理表单逻辑 request.POST是不可变QueryDict,无法直接赋值修改- ViewSet中自定义方法签名错误,且未使用
@action装饰器注册路由 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
相关产品推荐
相关产品推荐

