英文:
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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论