Django:用户登录不适用于某些用户

Django: User login not works for some users

我目前正在学习 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 模型中 class 您将 is_active 默认值设置为 False

is_active = models.BooleanField(default=False)

所以您的用户不是 activeregisterPage 视图创建的。

默认后端ModelBackend and RemoteUserBackend 禁止非活动用户进行身份验证。由于您是来自 django default authenticationauthenticating 用户,它总是 returns None.

如果您希望您创建的所有用户都将 is_active 设置为 True,那么您可以将 default 设置为 True。

is_active = models.BooleanField(default=True)

否则,您可以在 views.py 中添加逻辑,以便在某些条件下 success

is_active 设置为 True
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)

并在此 case 中将 default 设置为 False。