我的 views.py :
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:使用名为“pk”的URL关键字参数调用的预期视图user_password。修复您的网址,或者在视图上正确设置
.lookup_field
属性。
我知道序列化器是可以的,因为当我使用不同类型的View进行相同的操作时。它有效:
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 :(得分:1)
.lookup_feild
是您的网址格式中UpdateAPIView
所期望的字段(捕获组)(默认情况下为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
就可以了(我不知道你的项目中JWT认证是如何实现的,但是大多数时候Django都会在request.user
中提取用户模型)。