Django – 上传文件并填充模型字段为文件名

huangapple go评论120阅读模式
英文:

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

huangapple
  • 本文由 发表于 2023年4月6日 21:51:21
  • 转载请务必保留本文链接:https://go.coder-hub.com/75950311.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定