python-3.x - 图像上传序列化程序不起作用但有效并正在保存
问题描述
我已经尝试了所有方法,但我无法弄清楚为什么我的 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。
我深了半天,一无所获。
解决方案
- 不确定您的用户是否已登录;
- 如您的表单数据所示:
<QueryDict: {'myFile': [<InMemoryUploadedFile: 1965.jpg (image/jpeg)>]}> [07/Feb/2021 10:48:54] "PUT /api/profile/avatar/ HTTP/1.1" 200 31
在您的表单数据中,图像的“输入名称”是“myFile”,而模型和序列化器中的图像字段名称是“头像”。
推荐阅读
- python-3.x - 使用 pip3 安装 spacy 时出错
- git - 连接多个 Repos 的 Git History
- ruby-on-rails - rails rake 任务暂停了一段时间,然后在控制台上继续按 enter
- android - 为什么我的 SQLite 无法创建表 ID 列?
- sql-server-2012 - 在 sql server 2012 中获取 Sum 列的总和
- javascript - 如何使用 DataTables 插件显示带有 2 个标题的表格?
- java - 小文件的音频缓存android studio
- laravel - Laravel 图像干预约束
- c++ - 服务器变量 UNENCODED_URL 包含奇怪的值而不是编码的斜杠
- javascript - 分配数组值以在 jquery 中下拉