我试图将图像从我的前端(React)上传到 Django,但我收到错误,错误请求,可能是因为序列化程序不接受图像数据。
这是数据到达后端的方式 <QueryDict: {'id': ['1'], 'image': ['[object Object]']}>
这是我的看法。
class ProfilePictureView(APIView):
parser_classes = [MultiPartParser, FormParser]
def post(self, request):
print(request.data)
ipdb.set_trace()
serializer = ProfilePictureSerializers(data=request.data)
if serializer.is_valid():
try:
picture = User.objects.get(id=request.data['id'])
picture.image = request.data['image']
picture.save()
serializer = ProfilePictureSerializers(picture)
return Response(serializer.data, status=status.HTTP_200_OK)
except:
return Response({"Detail": "Not found"}, status=status.HTTP_404_NOT_FOUND)
else:
return Response(status=status.HTTP_400_BAD_REQUEST)
这是我的模型。
def upload_to(instance, filename):
return 'media/{filename}'.format(filename=filename)
class User(AbstractUser):
image = models.ImageField(_("Image"),null=True, blank=True, upload_to=upload_to, default='media/default.png')
序列化器。
class ProfilePictureSerializers(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'image')
还有我在前端的申请。
const config = {headers: {'content-type': 'multipart/form-data'}};
export const ProfilePictureThank = (UserData, setError) => (dispatch) => {
let formData = new FormData();
formData.append("id", UserData.id)
formData.append("image", UserData.image)
axios
.post(
`${url_local}/api/profile/picture/`, formData, config)
.then((info) => {
dispatch(postUserProfilePicture(info.data));
})
.catch((error) => {
setError(true);
dispatch(postUserProfilePicture(error));
});
};
这里是个人资料应用程序。
const UserData = {
id: userId,
image: photo
}
const changeImage = async (e) => {
setPhoto({image: e.target.files})
dispatch(await ProfilePictureThank( UserData, setError));
};
<section className="profile-picture-container">
<div className="profile-picture-item">
<img className="profile-photo" src={photo} />;
<label for="upload" className="change-photo-button" >
Trocar Imagem
<input name="image" encType="multipart/form-data" type="file" id="upload" onChange={changeImage} />
</label>
</div>
<div className="profile-picture-item">
Bem vindo, {name}
</div>
</section>
如果我从视图中删除 serializer.is_valid(),我会得到状态 200,但是图像不会保存。
我尝试了许多我在这里找到的堆栈溢出解决方案,但它们都不适用于我的情况。
如果有人可以帮助我,我将不胜感激。