2017-06-06 3 views
2

mein views.py:Django Ruhe Framework: Unklare Fehlermeldung

class user_password(generics.UpdateAPIView): 
    authentication_classes = ([JSONWebTokenAuthentication]) 
    serializer_class = user_password_serializer 

    def get_queryset(self): 
     return User.objects.get(id=self.request.user.id) 

Aber ich bin immer das, wenn es ausgeführt wird:

AssertionError: Expected view user_password to be called with a URL keyword argument named "pk". Fix your URL conf, or set the .lookup_field attribute on the view correctly.

Ich weiß, dass der Serializer in Ordnung ist, denn wenn ich Verwenden Sie eine andere Art von Ansicht für die gleiche Sache. Es funktioniert:

class user_password(APIView): 

    authentication_classes = ([JSONWebTokenAuthentication]) 

    def put(self, request, format=None): 

     serializer = user_password_serializer(data=request.data) 
     if serializer.is_valid(): 
      if request.user.check_password(serializer.validated_data[ 
               'old_password']): 
       request.user.set_password(serializer.validated_data[ 
              'new_password']) 
       request.user.save() 

       return Response({'success': True, 
           'result': serializer.validated_data}, 
           status=status.HTTP_200_OK) 
      else: 
        return Response({'success': False, 
            'result': "credential mismatch"}, 
            status=status.HTTP_401_UNAUTHORIZED) 


     return Response({'success': False, 
         'result': serializer.errors}, 
         status=status.HTTP_400_BAD_REQUEST) 

Ich möchte nicht ändern, wie ein Endpunkt erstellt wird. Ich habe einen JWT-authentifizierten Anruf, und ich wünschte/Benutzer/Passwort wäre einfach in der Lage, das "alte Passwort" und "neues Passwort" in den gleichen Benutzer zu putten.

Was mache ich falsch in meiner generics.UpdateAPIView Klasse? Was ist das .lookup_field es spricht?

+0

Können Sie die 'urls.py' für die Ansicht freigeben? –

+0

'url (r '^ user/password/$', ansichten.user_password.as_view()),' und ich möchte wirklich kein '/ {user_id} /' in meiner URL haben. Meine App ist JWT-basiert, der Benutzer wird bereits durch das JWT-Token erkannt. Ich möchte nur, dass ein Endpunkt das Benutzerpasswort ändert, derselbe Benutzer, der mit dem JWT-Token übereinstimmt. – JasonGenX

Antwort

0

.lookup_feild ist das Feld (Capture-Gruppe) die UpdateAPIView erwartet in Ihrem URL-Muster (pk Standardeinstellung), wie:

r'^user/(?P<pk>\d+)/password/?$' 

Allerdings sollten Sie in der Lage seine get_object statt get_queryset außer Kraft zu setzen und es sollte funktionieren ohne irgendwelche Änderungen an der URL.

class user_password(generics.UpdateAPIView): 
    authentication_classes = ([JSONWebTokenAuthentication]) 
    serializer_class = user_password_serializer 

    def get_object(self): 
     return User.objects.get(id=self.request.user.id) 

auch einfach self.request.user Rückkehr wird gut funktionieren (ich weiß nicht, wie genau JWT-Authentifizierung in Ihrem Projekt implementiert, aber die meiste Zeit Django zieht das Benutzermodell in request.user sowieso).

+0

mit Ihrem Vorschlag 'get_object (self)' überschreiben Ich bekomme eine '.update() muss implementiert werden.' Fehler. – JasonGenX

+0

@Gdalia Ja, Sie brauchen eine Update-Methode für Ihre Klasse * Serializer *. Wenn Sie Probleme damit haben - fügen Sie Ihren Serializer der Frage hinzu und pingen Sie mich an – Igonato

+0

Vielen Dank für Ihre Antwort – JasonGenX

Verwandte Themen