首页 > 解决方案 > 图像上传序列化程序不起作用但有效并正在保存

问题描述

我已经尝试了所有方法,但我无法弄清楚为什么我的 Avatar 图像不会保存到 Django 中的媒体文件夹中。

我很高兴前端将表单数据传递给 AvatarAPIView,当我打印出传递给视图的数据时,我得到以下信息。

<QueryDict: {'myFile': [<InMemoryUploadedFile: 1965.jpg (image/jpeg)>]}>
[07/Feb/2021 10:48:54] "PUT /api/profile/avatar/ HTTP/1.1" 200 31

视图.py

from profiles.api.serializers import (UserDisplaySerializer,
                                  SubscriptionSerializer,
                                  AvatarSerializer)
from profiles.models import CustomUser
from rest_framework import status, viewsets
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.generics import UpdateAPIView, GenericAPIView
from rest_framework import mixins
from rest_framework.parsers import MultiPartParser, FileUploadParser, FormParser

from django.http import HttpResponse


class CurrentUserAPIView(APIView):

    def get(self, request):
        serializer = UserDisplaySerializer(request.user)
        return Response(serializer.data)

    def patch(self, request):
        serializer = UserDisplaySerializer(request.user, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


class UserUpdateAPIView(UpdateAPIView):
    queryset = CustomUser.objects.all()
    serializer_class = UserDisplaySerializer


class AvatarAPIView(APIView):
    parser_classes = (MultiPartParser, FormParser)

    def get(self, request):
        serializer = AvatarSerializer(request.user)
        return Response(serializer.data)

    def put(self, request, format=None):
        serializer = AvatarSerializer(
            request.user, data=request.data)
        print(request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

序列化程序.py

from rest_framework import serializers
from profiles.models import CustomUser, Subscription


class SubscriptionSerializer(serializers.ModelSerializer):

    class Meta:
        model = Subscription
        exclude = ('id', 'user', )


class UserDisplaySerializer(serializers.ModelSerializer):
    subscription = SubscriptionSerializer(read_only=True, many=False)

    class Meta:
        model = CustomUser
        exclude = ('password',)


class AvatarSerializer(serializers.ModelSerializer):

    class Meta:
        model = CustomUser
        fields = ('avatar',)

网址.py

from django.urls import path
from django.conf.urls import include
from profiles.api.views import (CurrentUserAPIView,
                                UserUpdateAPIView,
                                AvatarAPIView,
                                )

from rest_framework import routers


urlpatterns = [
    path("user/", CurrentUserAPIView.as_view(), name="current-user"),
    path("user/update/<int:pk>", UserUpdateAPIView.as_view()),
    path("avatar/", AvatarAPIView.as_view(), name='user-avatar'),
]

模型.py

from django.db import models
from django.contrib.auth.models import AbstractUser


class CustomUser(AbstractUser):
    bio = models.CharField(max_length=240, blank=True)
    city = models.CharField(max_length=30, blank=True)
    avatar = models.ImageField(null=True, blank=True)

我可以从 Django 管理员上传文件没有问题。只是在通过序列化程序运行时我遇到了问题。特别是因为数据通过了 is_valid() 并发出了代码 200。

我深了半天,一无所获。

标签: python-3.xdjangodjango-rest-framework

解决方案


  1. 不确定您的用户是否已登录;
  2. 如您的表单数据所示: <QueryDict: {'myFile': [<InMemoryUploadedFile: 1965.jpg (image/jpeg)>]}> [07/Feb/2021 10:48:54] "PUT /api/profile/avatar/ HTTP/1.1" 200 31

在您的表单数据中,图像的“输入名称”是“myFile”,而模型和序列化器中的图像字段名称是“头像”。


推荐阅读