Как получить пользовательский объект из запроса в django rest framework? - PullRequest
0 голосов
/ 24 марта 2020

Я хочу получить пароль действующего пользователя из тела запроса и подтвердить его.

Я пытаюсь получить объект пользователя из запроса следующим образом:

class UserPasswordUpdateAsAdminViewSet(APIView):

    def patch(self, request, pk):
        serializer = ResetPasswordAsAdminSerializer(data=request.data,
                                                    context={'request': request})
        serializer.is_valid(raise_exception=True)
        serializer.update_password()

        return Response(status=status.HTTP_200_OK, data={'success': True})

и ниже мой сериализатор:

class ResetPasswordAsAdminSerializer(serializers.ModelSerializer):
    new_password = serializers.CharField(write_only=True)
    password = serializers.CharField(write_only=True)

    def validate_password(self, attrs):
        self.user = None
        request = self.context.get("request")
        if request and hasattr(request, "user"):
            self.user = request.user

        if not self.user or not self.user.check_password(attrs['password']):
            raise CustomAPIException(
                status_code=status.HTTP_401_UNAUTHORIZED,
                message='Invalid password provided',
                error_code=None
            )

    def validate_new_password(self, password):
        if not re.match(REGEX['password'], str(password)):
            raise CustomAPIException(
                status_code=status.HTTP_409_CONFLICT,
                message=None,
                error_code='password_policy_mismatch'
            )

        return password

    def update_password(self):
        self.user.set_password(self.validated_data['new_password'])
        self.user.save()
        return

    class Meta:
        model = User
        fields = ('password', 'new_password')

Но при нажатии API я получаю следующую ошибку:

string indices must be integers

Что я делаю не так?

1 Ответ

0 голосов
/ 24 марта 2020

Вам не нужно делать это в самом сериализаторе, это можно сделать в представлениях, довольно легко взглянуть на этот пример

    serializer = PasswordSerializer(data=request.data)

    if serializer.is_valid():
        if not user.check_password(serializer.data.get('old_password')):
            return Response({'old_password': ['Wrong password.']}, 
                            status=status.HTTP_400_BAD_REQUEST)
        # set_password also hashes the password that the user will get
        user.set_password(serializer.data.get('new_password'))
        user.save()
        return Response({'status': 'password set'}, status=status.HTTP_200_OK)

    return Response(serializer.errors,
                    status=status.HTTP_400_BAD_REQUEST)
...