Django: Вход в систему не работает для некоторых пользователей

В настоящее время я изучаю django. Вот моя проблема: пользователь, созданный с помощью терминала с помощью createsuperuser, может войти на сайт, но пользователи, созданные с помощью моей страницы регистрации, не входят. Пользователи, созданные с помощью моей регистрации, появляются в панели администратора, и все поля соответствуют введенным данным. Я предполагаю, что проблема где-то в CustomUserManager (до его создания логин работал нормально)

models.py

class CustomUserManager(BaseUserManager):

    def create_superuser(self, email, username, first_name, bio, password, **other_fields):
        other_fields.setdefault('is_staff', True)
        other_fields.setdefault('is_superuser', True)
        other_fields.setdefault('is_active', True)

        if other_fields.get('is_staff') is not True:
            raise ValueError("Superuser must be assigned staff to True")
        
        if other_fields.get('is_superuser') is not True:
            raise ValueError("Superuser must be assigned superuser to True")

        return self.create_user(email, username, first_name, bio, password, **other_fields)

    def create_user(self, email, username, first_name, bio, password, **other_fields):

        if not email:
            raise ValueError("You must provide an email.")

        email = self.normalize_email(email)
        user = self.model(email=email, username=username, first_name=first_name, bio=bio,
                           **other_fields)
        user.set_password(password)
        user.save()
        return user


class User(AbstractBaseUser, PermissionsMixin):
    first_name = models.CharField(max_length=200, null=True, verbose_name="Имя")
    username = models.CharField(
        max_length=50, null=True, verbose_name="Никнейм", unique=True)
    email = models.EmailField(null=True, unique=True)
    bio = models.TextField(null=True, blank=True)
    
    avatar = models.ImageField(null=True, default="avatar.svg", blank=True)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=False)

    objects = CustomUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name','username','bio']

    def __str__(self):
        return self.username

views.py

def loginPage(request):
    page = 'login'
    if request.user.is_authenticated:
        return redirect('home')

    if request.method == 'POST':
        email = request.POST.get('email').lower()
        password = request.POST.get('password')

        try:
            user = User.objects.get(email=email)
            print(user)
        except:
            messages.error(request, 'User does not exist.')
        user = authenticate(request, email=email, password=password)

        if user is not None:
            login(request, user)
            return redirect('home')
        else:
            messages.error(request, 'Username or password does not exist.')

    context = {'page': page}
    return render(request, 'base/login_register.html', context)




def registerPage(request):
    form = MyUserCreationForm()

    if request.method == 'POST':
        form = MyUserCreationForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.username = user.username.lower()
            user.save()
            login(request, user)
            return redirect('home')
        else:
            messages.error(request, 'An error occured during registration.')

    context = {'form': form}
    return render(request, 'base/login_register.html', context)

В вашем наборе моделей User:

is_active = models.BooleanField(default=True)

В своем классе модели User вы установили is_active значение по умолчанию False

is_active = models.BooleanField(default=False)

Так что ваш пользователь не active при создании из registerPage представления.

Бэкенд по умолчанию ModelBackend и RemoteUserBackend запрещает аутентификацию неактивных пользователей. Поскольку вы authenticating пользователь из django default authentication всегда возвращает None.

Если вы хотите для всех созданных вами пользователей установить значение is_active в True, тогда вы можете установить значение default в True.

is_active = models.BooleanField(default=True)

Иначе вы можете добавить логику в ваш views.py, чтобы установить is_active в True, если некоторое условие success

def registerPage(request):
    form = MyUserCreationForm()

    if request.method == 'POST':
        form = MyUserCreationForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.username = user.username.lower()
            if active_true_condition: #<--- if condition true set True
                user.is_active = True
            user.save()
            login(request, user)
            return redirect('home')
        else:
            messages.error(request, 'An error occured during registration.')

    context = {'form': form}
    return render(request, 'base/login_register.html', context)

И установите default значение False в этом case.

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