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.