代码之家  ›  专栏  ›  技术社区  ›  PotatoBox

Django Rest框架:将用户从视图传递到序列化程序

  •  0
  • PotatoBox  · 技术社区  · 6 年前

    我对用户更改密码有这样的看法:

    class ChangePasswordView(generics.UpdateAPIView):
        serializer_class = ChangePasswordSerializer
        permission_classes = [IsAuthenticated]
    
            def put(self, request, *args, **kwargs):
                data = request.data.copy()
                data['user'] = self.request.user
                serializer = self.get_serializer(data=data)
                serializer.is_valid(raise_exception=True)
                user = serializer.validated_data['user']
                user.set_password(serializer.validated_data["new_password"])
                user.save()
                return Response(status=status.HTTP_204_NO_CONTENT)
    

    此视图的序列化程序如下所示:

    class ChangePasswordSerializer(serializers.Serializer):
        old_password = serializers.CharField()
        new_password = serializers.CharField()
        new_password_retyped = serializers.CharField()
    
        def validate(self, data):
            old_password = data.get('old_password')
            new_password = data.get('new_password')
            new_password_retyped = data.get('new_password_retyped')
            user = data.get('user')
    
            # misc validation checks
    
            data['user'] = user
            return data
    

    put :

    <QueryDict: {'old_password': ['testpassword'], 'new_password': ['testpassword1'], 'new_password_retyped': ['testpassword1'], 'user': [<User: root>]}>
    

    OrderedDict([('old_password', 'testpassword'), ('new_password', 'testpassword1'), ('new_password_retyped', 'testpassword1')])
    

    data['user'] = self.request.user data['user'] = self.request.user.username

    1 回复  |  直到 6 年前
        1
  •  10
  •   Nafees Anwar    6 年前

    您不能以这种方式将用户传递给序列化程序,因为序列化程序会删除不相关的数据。试着做这样的事。

    class ChangePasswordSerializer(serializers.Serializer):
        old_password = serializers.CharField()
        new_password = serializers.CharField()
        new_password_retyped = serializers.CharField()
    
        def __init__(self, *args, **kwargs):
            self.user = kwargs.pop('user')
            super().__init__(*args, **kwargs)
    
        def validate(self, data):
            old_password = data.get('old_password')
            new_password = data.get('new_password')
            new_password_retyped = data.get('new_password_retyped')
            user = self.user
    
            # misc validation checks
    
            data['user'] = user
            return data
    

    self.get_serializer(data=data, user=self.request.user)