В проекте Django метод authenticate возвращает None

У меня проблема с методом authenticate(). Он всегда возвращает None. Я проверил все аргументы и они не пустые. В модели у меня USERNAME_FIELD = 'username', в настройках у меня AUTH_USER_MODEL = 'account.User'. Я действительно не могу понять, почему это не работает. Помогите пожалуйста

models.py

class UserManager(BaseUserManager):
def _create(self, username, password):
    if not username:
        raise ValueError('Username cant be empty')
    user = self.model(username=username)
    user.set_password(raw_password=password)
    user.save()
    return user

def create_user(self, username, password):
    return self._create(username=username, password=password)

class User(AbstractBaseUser):
    id = models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='id')
    email = models.EmailField()
    username = models.CharField(max_length=25, unique=True)
    is_active = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    education = models.CharField(max_length=100, blank=True)
    date_of_birth = models.DateField(blank=True, null=True)
    name = models.CharField(max_length=25, blank=True)
    last_name = models.CharField(max_length=25, blank=True)

    objects = UserManager()

    USERNAME_FIELD = 'username'

views.py

class UserLoginView(ObtainAuthToken):
    serializer_class = UserLoginSerializer

serializers.py

class UserLoginSerializer(serializers.Serializer):
    username = serializers.CharField(required=True)
    password = serializers.CharField(required=True)

    def validate_username(self, username):
        if not User.objects.filter(username=username).exists():
            raise serializers.ValidationError('User wasn\'t found')
        print(User.objects.get(username=username).password)
        return username

    def validate(self, data):
        # authentications
        request = self.context.get('request')
        username = data.get('username') # test_name
        password = data.get('password') # newpassword11
        if username and password:
            user = authenticate(username=username, password=password, request=request)
            print(user)
            if not user:
            raise serializers.ValidationError('Invalid password')
        else:
            raise serializers.ValidationError('You have to type you\'re mail and password')
        data['user'] = user
        return data

Я исправил это, изменив модель на следующую:

class User(AbstractBaseUser, PermissionsMixin):
    .....

после отправки post запроса на url маршрутизация в UserLoginView представление с username и password в теле поста получили Json что-то вроде этого в ответе:

{"token":"30e0215a5f4cc521203a633452d63995d8f1fa77"}

При использовании AbstractBaseUser вместо AbstractUser будьте внимательны, чтобы реализовать все требования пользовательской модели Django.

Советы: Не забудьте правильно выполнить настройки DRF Authentication.

Проблема была в поле users, называемом is_active. Django позволяет login только когда пользователь активен.

P.S. Спасибо всем, кто пытался помочь :)

Вернуться на верх