Неверное имя пользователя / пароль. Django rest framework custom user serializer - PullRequest
0 голосов
/ 02 июля 2018

Пользовательская модель:

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)

Rider сериализатор:

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)

конечная точка райдера: / райдеры /

Я могу создать объект пользователя, но аутентификация пользователя не удалась, поскольку пароль сохраняется в виде простого текста в объекте.

Я пытался использовать User.objects.create_user (имя пользователя, пароль = пароль, ** validated_data), чтобы установить пароль в качестве хешированного значения, но он не работает

Я также пытался использовать метод make_password для установки хешированного пароля, но, похоже, ничего не работает.

Пожалуйста, скажите мне, что мне не хватает. Как сохранить хешированный пароль в поле пароля пользовательского объекта.

1 Ответ

0 голосов
/ 02 июля 2018

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.

...