Django:DRF自定义密码更改视图和序列化程序不起作用

问题描述 投票:0回答:1

我已经定义了一个序列化程序类和一个视图类来执行密码更改。通常,用户需要输入旧密码,然后输入两次新密码进行确认。我正在使用AbstractBaseUser来实现自定义用户。我用old_password_validator的建议定义了new_password_validatorthread,尽管我不知道如何使它起作用。

我正在使用djangorestframework_simplejwt进行各种身份验证。

我的序列化程序类:

class ChangePasswordSerializer(serializers.ModelSerializer):
    old_password = serializers.CharField(required=True, write_only=True)
    new_password = serializers.CharField(required=True, write_only=True)
    re_new_password = serializers.CharField(required=True, write_only=True)

    def update(self, instance, validated_data):

        instance.password = validated_data.get('password', instance.password)

        if not validated_data['new_password']:
              raise serializers.ValidationError({'new_password': 'not found'})

        if not validated_data['old_password']:
              raise serializers.ValidationError({'old_password': 'not found'})

        if not instance.check_password(validated_data['old_password']):
              raise serializers.ValidationError({'old_password': 'wrong password'})

        if validated_data['new_password'] != validated_data['re_new_password']:
            raise serializers.ValidationError({'passwords': 'passwords do not match'})

        if validated_data['new_password'] == validated_data['re_new_password'] and instance.check_password(validated_data['old_password']):
            instance.set_password(validated_data['new_password'])
            instance.save()
            return instance

    class Meta:
        model = User
        fields = ['old_password', 'new_password','re_new_password']

我这样定义了我的视图类:

class ChangePasswordView(generics.UpdateAPIView):
    permission_classes = (permissions.IsAuthenticated,)

    def update(self, request, *args, **kwargs):
        serializer = ChangePasswordSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
             serializer.save()
             return Response(serializer.data, status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

当我输入值,标题并运行邮递员时,出现此错误:

调用TypeError时得到User.objects.create()。这可能是因为您在序列化程序类上有一个可写字段,该字段不是User.objects.create()的有效参数。您可能需要将该字段设置为只读,或重写ChangePasswordSerializer.create()方法才能正确处理此问题。

我无法从此错误声明中做出任何事情。

django django-rest-framework change-password
1个回答
0
投票

您需要传递ChangePasswordSerializer的实例参数:

serializer = ChangePasswordSerializer(instance=self.request.user, data=request.data)

[当不传递实例参数时,序列化程序在调用save()时运行create()方法,否则(在提供实例arg的情况下)将调用update()。

© www.soinside.com 2019 - 2024. All rights reserved.