2017-06-06 59 views
2

views.pyDjango的REST框架:不確定錯誤消息

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) 

但運行它時,我得到這個:

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.

我知道串行器是好的,因爲當我對同一事物使用不同類型的視圖。它的工作原理:

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) 

我不想改變端點的構建方式。我確實有一個JWT認證的呼叫,並且我希望/用戶/密碼能夠簡單地將「舊密碼」和「新密碼」放入同一個用戶。

我在做什麼錯在我的generics.UpdateAPIView類?那是什麼.lookup_field它在說什麼?

+0

你可以分享視圖的'urls.py'嗎? –

+0

'url(r'^ user/password/$',views.user_password.as_view())',我真的不想在我的URL中有一個'/ {user_id} /'。我的應用程序基於JWT,用戶已通過JWT令牌識別。我只想讓端點更改用戶密碼,即匹配JWT令牌的相同用戶。 – JasonGenX

回答

0

.lookup_feild是現場(拍攝集團)UpdateAPIView預計在URL模式(pk默認情況下),如:

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

但是,你應該能夠覆蓋get_object,而不是get_queryset它應該工作沒有任何更改的網址。

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) 

而且,簡單地返回self.request.user會工作得很好(我不知道智威湯遜認證的項目究竟如何實施,但大部分時間Django的拉動request.user用戶模型反正)。

+0

你的建議'get_object(self)'override我得到'.update()必須實現.'錯誤。 – JasonGenX

+0

@Gdalia是的,你需要* serializer *類的更新方法。如果您遇到問題 - 將您的序列化程序添加到問題並ping我 – Igonato

+0

謝謝您的回答 – JasonGenX