【问题标题】:Django Rest Framework: Unclear error messageDjango Rest Framework:不明确的错误信息
【发布时间】:2017-11-08 01:57:34
【问题描述】:

我的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:预期视图 user_password 将使用名为“pk”的 URL 关键字参数调用。修正你的 URL 配置,或者正确设置视图的 .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 身份验证的调用,我希望 /user/password 能够简单地将“旧密码”和“新密码”放入同一个用户中。

我在generics.UpdateAPIView 课堂上做错了什么? .lookup_field 在说什么?

【问题讨论】:

  • 你能分享一下urls.py的观点吗?
  • url(r'^user/password/$', views.user_password.as_view()), 我真的不想在我的网址中有/{user_id}/。我的应用是基于 JWT 的,用户已经通过 JWT 令牌被识别。我只想要一个端点来更改用户密码,与 JWT 令牌匹配的同一用户。

标签: python django django-views django-rest-framework


【解决方案1】:

.lookup_feildUpdateAPIView 在您的 url 模式中期望的字段(捕获组)(默认为 pk),例如:

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

但是,您应该能够覆盖 get_object 而不是 get_queryset,并且它应该可以在不更改 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)

另外,简单地返回 self.request.user 就可以了(我不知道你的项目中究竟是如何实现 JWT 身份验证的,但大多数时候 Django 无论如何都会在 request.user 中拉取用户模型)。

【讨论】:

  • 根据您的建议 get_object(self) override 我收到 .update() must be implemented. 错误。
  • @Gdalia 是的,你的 serializer 类需要一个更新方法。如果您对此有疑问 - 将您的序列化程序添加到问题中并 ping 我
猜你喜欢
  • 1970-01-01
  • 2016-09-09
  • 2014-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-22
  • 2015-02-13
相关资源
最近更新 更多