Django Rest API - Как изменить пароль пользователя?

Я пытаюсь изменить пароль пользователя с помощью Django REST Framework (DRF), но получаю только пустой ответ и не понимаю почему, пожалуйста, посмотрите мой код.

url.py

re_path(r'^api/v1/user/change_password$', API_Views.change_password, name='api_change_password'),

views.py

@api_view(['PUT'])
@authentication_classes([JSONWebTokenAuthentication])
@permission_classes([IsAuthenticated])
def change_password(request,):
    if request.method == 'PUT':
        serializer = ChangePasswordSerializer(request.user)
        return JsonResponse(serializer.data, safe=False)

serializers.py

class ChangePasswordSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True, required=True, validators=[validate_password])
    password2 = serializers.CharField(write_only=True, required=True)
    old_password = serializers.CharField(write_only=True, required=True)

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

    def validate(self, attrs):
        if attrs['password'] != attrs['password2']:
            raise serializers.ValidationError({"password": "Password fields didn't match."})
        return attrs

    def validate_old_password(self, value):
        user = self.context['request'].user
        if not user.check_password(value):
            raise serializers.ValidationError({"old_password": "Old password is not correct"})
        return value

    def update(self, instance, validated_data):
        instance.set_password(validated_data['password'])
        instance.save()
        return instance

Что мне здесь не хватает? Пожалуйста, взгляните также на запрос, который я создал

enter image description here

enter image description here

Вам необходимо добавить readonly=True для поля old_password, поскольку его нет в модели User, а также другие поля, которых нет в модели User. Также необходимо добавить эти поля в Meta.fields.

В вашем случае, возможно, нет необходимости использовать serializers.ModelSerializer. Вы можете обратиться к старой записи о смене пароля.

Вернуться на верх