I'm currently learning django. Here is my problem: user created using terminal with createsuperuser can log in to the website, but users created with my register page are not. Users created using my registration appear in the admin panel and all fields match the entered data. I guess the problem is somewhere in CustomUserManager(before creating it login worked properly)
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)
CodePudding user response:
In your User model class you set is_active default value to False
is_active = models.BooleanField(default=False)
So your user is not active when created from registerPage view.
The default backend ModelBackend and RemoteUserBackend prohibits the inactive users from authenticating. Since you are authenticating user from django default authentication it always returns None.
If you want all user's you created to set is_active to True for all users then you can set default to True.
is_active = models.BooleanField(default=True)
Otherwise you can add logic in your views.py to set is_active to True if some condition 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)
And set default to False in this case.
CodePudding user response:
In your User models set:
is_active = models.BooleanField(default=True)
