2017-06-06 57 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