Django Rest Framework: Télécharger un fichier via AJAX

J’ai une vue et un sérialiseur:

class UserView(generics.ResortingeveUpdateAPIView): model = get_user_model() serializer_class = UserProfileSerializer permission_classes = (permissions.IsAuthenticated,) def get_object(self, *args, **kwargs): return self.request.user class UserImageSerializer(serializers.ModelSerializer): class Meta: model = get_user_model() fields = ('image',) 

Ils fonctionnent très bien avec httpie:

 http -f put localhost:8000/accounts/api/image/ "Authorization: Token mytoken" image@~/Downloads/test.jpg HTTP/1.0 200 OK Allow: GET, PUT, PATCH, HEAD, OPTIONS Content-Type: application/json Date: Thu, 03 Sep 2015 22:50:33 GMT Server: WSGIServer/0.2 CPython/3.4.3 Vary: Accept X-Frame-Options: SAMEORIGIN { "image": "http://localhost:8000/media/accounts/user_images/test.jpg" } 

et mon image est téléchargée et apparaît dans l’admin.

Maintenant, je veux pouvoir télécharger un fichier en utilisant AJAX, mais apparemment, cela ne veut pas fonctionner:

 
$('form').submit(function(e) { var formData = new FormData($(this)); $.ajax({ url: $(this).attr('action'), type: $(this).attr('method'), data: formData, headers: {'Authorization': 'Token mytoken'}, cache: false, contentType: false, processData: false, success: function() { alert('it works') }, }); e.preventDefault(); });

Maintenant, mon alerte “Cela fonctionne” apparaît. Je sais que le formulaire est envoyé au bon endroit. Je vois dans le serveur de développement de Django qu’il est demandé en tant que PUT et qu’il répond avec 200 (même réponse qu’avec httpie):

 [03/Sep/2015 22:47:23] "PUT /accounts/api/image/ HTTP/1.1" 200 77 

Mais il semble que le fichier n’est pas en cours de téléchargement et qu’il n’apparaisse pas dans l’administrateur.

Je suis à court d’idées.

Ok, je ne peux pas expliquer pourquoi, mais il semble que var formData = new FormData($(this)); n’est pas suffisant à lui seul, il doit être explicitement ajouté, parce que des raisons? Si quelqu’un peut expliquer, s’il vous plaît faites-le.

Le code de travail: