英文:
Django - Upload a file and populate field model with file name
问题
我使用Django并想要构建一个上传文件页面。当用户上传文件时,它会将文件存储在一个文件夹中。我想要获取原始文件名以填充我的模型中的字段(SourceFile.file)。
文件已经成功上传,但是我无法访问request.FILES属性,即使使用request.FILES.get('uploaded_to')或request.FILES['uploaded_to']也无法将SourceFile.file填充为文件名。
如何实现这个?我的参考文献是官方文档。
models.py
from django.db import models
class SourceFile(models.Model):
    file = models.CharField(max_length=255)  # 指定最大长度
    uploaded_to = models.FileField(upload_to='/uploads/')
serializers.py
from rest_framework import serializers
from .models import SourceFile
class SourceFileSerializer(serializers.ModelSerializer):
    class Meta:
        model = SourceFile
        fields = ['file', 'uploaded_to']
views.py
from django.shortcuts import render
from rest_framework import viewsets
from rest_framework.response import Response
from .models import SourceFile
from .serializers import SourceFileSerializer
class SourceFileViewSet(viewsets.ModelViewSet):
    serializer_class = SourceFileSerializer
    def list(self, request):
        return Response("GET API")
    def upload_file(request):
        if request.method == "POST":
            form = SourceFile(request.POST, request.FILES)
            if form.is_valid():
                file_uploaded = request.FILES['uploaded_to']
                file_name = file_uploaded.name
                form.cleaned_data['file'] = file_name
                form.save()
                return HttpResponseRedirect("/success/url/")
            else:
                form = SourceFile()
            return render(request, "upload.html", {"form": form})
英文:
I'm using Django and want to build an upload file page. When user upload a file, it stores it in a folder. I wan't to get the original file name to populate a field in my model (SourceFile.file).
File is well uploaded, but I can't reach request.FILES properties, even with request.FILES.get('uploaded_to') or request.FILES['uploaded_to'] to fill in SourceFile.file with file name.
How to achieve this ? My source is official documentation.
models.py
from django.db import models
class SourceFile(models.Model):
    file = models.CharField()
	uploaded_to = models.FileField(upload_to ='/uploads/')
serializers.py
from rest_framework import serializers
from .models import *
class SourceFileSerializer(serializers.ModelSerializer):
    class Meta:
        model = SourceFile
        fields = ['file', 'uploaded_to']
views.py
class SourceFileViewSet(viewsets.ModelViewSet):
    serializer_class = SourceFileSerializer
    def list(self, request):
        return Response("GET API")        
    
    def upload_file(request):
        if request.method == "POST":
            form = SourceFile(request.POST, request.FILES)
            # Nothing happened
            file_uploaded = request.FILES.get('uploaded_to')            
            file_name = file_uploaded.name
            request.POST['file'] = file_name
            #
            if form.is_valid():              
                form.save()                     
                return HttpResponseRedirect("/success/url/")                
            else:
                form = SourceFile()
            return render(request, "upload.html", {"form": form})
答案1
得分: 1
你不需要单独存储文件名,可以通过以下方式直接访问它:
instance = SourceFile.objects.first()
print(instance.uploaded_to.name)
更多信息可以在文档中找到。
英文:
You do not need to store the file name seperately, you can access it directly by:
instance = SourceFile.objects.first()
print(instance.uploaded_to.name)
More information can be found in the documenation.
答案2
得分: 0
现在是我的中文翻译:
如@ruddra建议,我的方法与表单无关,不是视图集类的一部分。一个更好的方法是:
class upload_file(viewsets.ReadOnlyModelViewSet):
    queryset = models.SourceFile.objects.all()
    serializer_class = serializers.SourceFileSerializer
英文:
As @ruddra suggests my method with a form is not a part of viewset class. A better way is:
class upload_file(viewsets.ReadOnlyModelViewSet):
    queryset = models.SourceFile.objects.all()
    serializer_class = serializers.SourceFileSerializer
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论