Django PUT/PATCH request body is empty in RetrieveUpdateAPIView

644 Views Asked by At

I'm trying to update user by passing Jwt token in header. But body of my request is empty.

View passes empty data to serializer.

views.py

class UserRetrieveUpdateAPIView(RetrieveUpdateAPIView):
    permission_classes = (IsAuthenticated,)
    renderer_classes = (UserJSONRenderer,)
    serializer_class = UserSerializer

    def retrieve(self, request, *args, **kwargs):
        serializer = self.serializer_class(request.user)
        return Response(serializer.data, status=status.HTTP_200_OK)

    def update(self, request, *args, **kwargs):
        serializer_data = request.data.get('user', {})
        print(f'request data: {request.data}') # prints empty dic {}
        serializer = self.serializer_class(
            request.user, data=serializer_data, partial=True
        )
        serializer.is_valid(raise_exception=True)
        serializer.save()

        return Response(serializer.data, status=status.HTTP_200_OK)

When I run PUT or PATCH request on Postman, I get unchanged user which is related to a token.

postman: Postman

django terminal says: Error

Can someone explain what am I doing wrong?

UPD:

I don't know why, but django can't receive '{' in PUT request.

I echoed in postman-echo.com/put. It responded the same body I sent.

Echo of PUT request

How to make Django accept '{' at the beginning of a request body?

1

There are 1 best solutions below

1
On

it happen to me as well, following a tutorial, so i replaced this:

serializer_data = request.data.get('user', {})

with just this:

serializer_data = request.data

seems to work (at least for me),hope that helps.