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)
所以您的用户不是 active
从 registerPage
视图创建的。
默认后端ModelBackend and RemoteUserBackend 禁止非活动用户进行身份验证。由于您是来自 django default
authentication
的 authenticating
用户,它总是 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。
我目前正在学习 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)
所以您的用户不是 active
从 registerPage
视图创建的。
默认后端ModelBackend and RemoteUserBackend 禁止非活动用户进行身份验证。由于您是来自 django default
authentication
的 authenticating
用户,它总是 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。