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

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

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

  1. from django.db import models
  2. class SourceFile(models.Model):
  3. file = models.CharField(max_length=255) # 指定最大长度
  4. uploaded_to = models.FileField(upload_to='/uploads/')

serializers.py

  1. from rest_framework import serializers
  2. from .models import SourceFile
  3. class SourceFileSerializer(serializers.ModelSerializer):
  4. class Meta:
  5. model = SourceFile
  6. fields = ['file', 'uploaded_to']

views.py

  1. from django.shortcuts import render
  2. from rest_framework import viewsets
  3. from rest_framework.response import Response
  4. from .models import SourceFile
  5. from .serializers import SourceFileSerializer
  6. class SourceFileViewSet(viewsets.ModelViewSet):
  7. serializer_class = SourceFileSerializer
  8. def list(self, request):
  9. return Response("GET API")
  10. def upload_file(request):
  11. if request.method == "POST":
  12. form = SourceFile(request.POST, request.FILES)
  13. if form.is_valid():
  14. file_uploaded = request.FILES['uploaded_to']
  15. file_name = file_uploaded.name
  16. form.cleaned_data['file'] = file_name
  17. form.save()
  18. return HttpResponseRedirect("/success/url/")
  19. else:
  20. form = SourceFile()
  21. 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

  1. from django.db import models
  2. class SourceFile(models.Model):
  3. file = models.CharField()
  4. uploaded_to = models.FileField(upload_to ='/uploads/')

serializers.py

  1. from rest_framework import serializers
  2. from .models import *
  3. class SourceFileSerializer(serializers.ModelSerializer):
  4. class Meta:
  5. model = SourceFile
  6. fields = ['file', 'uploaded_to']

views.py

  1. class SourceFileViewSet(viewsets.ModelViewSet):
  2. serializer_class = SourceFileSerializer
  3. def list(self, request):
  4. return Response("GET API")
  5. def upload_file(request):
  6. if request.method == "POST":
  7. form = SourceFile(request.POST, request.FILES)
  8. # Nothing happened
  9. file_uploaded = request.FILES.get('uploaded_to')
  10. file_name = file_uploaded.name
  11. request.POST['file'] = file_name
  12. #
  13. if form.is_valid():
  14. form.save()
  15. return HttpResponseRedirect("/success/url/")
  16. else:
  17. form = SourceFile()
  18. return render(request, "upload.html", {"form": form})

答案1

得分: 1

你不需要单独存储文件名,可以通过以下方式直接访问它:

  1. instance = SourceFile.objects.first()
  2. print(instance.uploaded_to.name)

更多信息可以在文档中找到。

英文:

You do not need to store the file name seperately, you can access it directly by:

  1. instance = SourceFile.objects.first()
  2. print(instance.uploaded_to.name)

More information can be found in the documenation.

答案2

得分: 0

现在是我的中文翻译:

如@ruddra建议,我的方法与表单无关,不是视图集类的一部分。一个更好的方法是:

  1. class upload_file(viewsets.ReadOnlyModelViewSet):
  2. queryset = models.SourceFile.objects.all()
  3. serializer_class = serializers.SourceFileSerializer
英文:

As @ruddra suggests my method with a form is not a part of viewset class. A better way is:

  1. class upload_file(viewsets.ReadOnlyModelViewSet):
  2. queryset = models.SourceFile.objects.all()
  3. 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:

确定