简体   繁体   中英

DRF Custom Update password got KeyError: 'request'

When I want to update password received error,

 user = self.context['request'].user
KeyError: 'request'

Can someone help me with it?

serializer: Custom serializer

class UserPasswordChangeSerializer(serializers.Serializer):
    old_password = serializers.CharField(required=True)
    password = serializers.CharField(required=True)

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

    def validate_old_password(self, data):
        user = self.context['request'].user
        if not user.check_password(data):
            raise serializers.ValidationError(
                {'old_password': 'Wrong password.'}
            )
        return data

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

My action view My action view

@action(methods=['patch'], detail=True)
    def change_password(self, request, *args, **kwargs):
        user = self.get_object()
        user.serializer = UserPasswordChangeSerializer(data=request.data)
        user.serializer.is_valid(raise_exception=True)
        user.serializer.save()
        return Response(status=status.HTTP_204_NO_CONTENT)

You need to pass request as context variable to the serializer

@action(methods=['patch'], detail=True)
def change_password(self, request, *args, **kwargs):
    user = self.get_object()
    user.serializer = UserPasswordChangeSerializer(data=request.data,
                                                   
    user.serializer.is_valid(raise_exception=True)
    user.serializer.save()
    return Response(status=status.HTTP_204_NO_CONTENT)

Reference: Including extra context in Serializer

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM