无效的用户名/密码错误Django Rest Framework自定义用户序列化程序

时间:2018-07-02 10:32:10

标签: django django-rest-framework

自定义用户模型:

class User(AbstractUser):
    ROLE_CHOICES = (
         ('R', 'rider'),
         ('D', 'driver'),
    )
    role = models.CharField(max_length=1, choices=ROLE_CHOICES)
    phone_number = models.CharField(max_length=10)
    cab = models.OneToOneField('Cab', on_delete=models.CASCADE, blank=True, null=True)

车手序列化器:

class RiderSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'email', 'phone_number', 'password')
        extra_kwargs = {
            'password': {'write_only': True}
        }
        def create(self, validated_data):
            username = validated_data.pop('username')
            password = validated_data.pop('password')
            instance = User(username, **validated_data)
            if password is not None:
               instance.set_password(password)
               instance.save()
            return instance

基于车手功能的查看方法:

@api_view(['GET', 'POST'])
def rider_list(request):
    if request.method == 'GET':
        riders = User.objects.filter(role='R')
        serializer = RiderSerializer(riders, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = RiderSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save(role='R')
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

乘车者终点:/ riders /

我能够创建用户对象,但由于密码以纯文本格式存储在对象中,因此用户身份验证失败。

我尝试使用User.objects.create_user(用户名,密码=密码,** validated_data)将密码设置为散列值,但它不起作用

我也尝试过使用make_password方法设置哈希密码,但似乎无济于事。

请告诉我我想念的是什么。如何将哈希密码存储在自定义用户对象的密码字段中。

1 个答案:

答案 0 :(得分:0)

create()方法应该是序列化程序类的一部分,而不是Meta的一部分:

class RiderSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'email', 'phone_number', 'password')
        extra_kwargs = {
            'password': {'write_only': True}
        }

    def create(self, validated_data):
        password = validated_data.pop('password')
        instance = User(**validated_data)
        if password is not None:
           instance.set_password(password)
           instance.save()
        return instance

此外,您无需弹出username字段。只需弹出密码并以set_password方法使用它即可。