Невозможно войти в систему обычному пользователю на сайте django с пользовательской моделью пользователя
Я создал пользовательскую модель пользователя для своего сайта. Я использовал AbstractBaseUser для создания модели, а также установил ее в настройках. Создание пользователя и суперпользователя работает нормально без каких-либо проблем, а также суперпользователь может войти в систему со страницы администратора. Однако когда я пытаюсь создать обычного пользователя для входа на сайт, возвращается сообщение User none. Но обычный пользователь существует в базе данных. Я использую authenticate, чтобы заставить пользователя войти в систему, так как я использовал AbstractBaseUser. Я не могу понять, почему это говорит, что пользователь не существует. Пожалуйста, поправьте меня, если я написал неправильные коды.
models.py (пользовательская модель пользователя), здесь is_active is false, но я вручную активирую ее после regd, так что проблема не из-за этого
class CustomUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField( unique= True)
full_name = models.CharField(max_length=255)
phone_no = models.CharField(max_length=10, blank= True)
address = models.CharField(max_length=500, blank= True)
plan = models.CharField(max_length=255, blank= True)
age = models.CharField(max_length=2, blank= True)
date_joined = models.DateTimeField(default=timezone.now)
is_staff = models.BooleanField( default=False)
is_active = models.BooleanField( default=False)
objects = CustomUserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['full_name']
def __str__(self):
return self.email
managers.py (менеджер пользовательской модели пользователя)
class CustomUserManager(BaseUserManager):
# CUSTOM USER MODEL FOR USER WHERE EMAIL IS THE USERNAME FOR AUTHENTICATION RATHER THEN USERNAME
def create_superuser(self, email, full_name, password, **other_fields):
# CREATE AND SAVE SUPERUSER WITH THE GIVEN EMAIL AND PASSWORD
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(_('is staff must be set to true'))
if other_fields.get('is_superuser') is not True:
raise ValueError(_('is superuser must be set to true'))
return self.create_user(email, full_name, password, **other_fields)
def create_user(self, email,full_name, password, **other_fields):
# CREATE AND SAVE USER WITH THE GIVEN EMAIL AND PASSWORD
if not email:
raise ValueError(_('The Email must be set'))
email = self.normalize_email(email)
user = self.model(email=email, full_name=full_name,**other_fields)
user.set_password(password)
user.save()
return user
settings.py
AUTH_USER_MODEL = 'account.CustomUser'
views.py (функция, передающая логин)
def loginpage(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('paswword')
# user = CustomUser.objects.get(email=username, password=password)
user = authenticate(request, email=username, password=password)
if user is not None:
login(request, user)
return redirect(user_page) # this is in home views
else:
return HttpResponse(' User doesnt exist') #FOR ERROR PURPOSE
else:
return render(request, 'login.html')
def t_and_c(request):
return render(request, 'terms_and_condition.html')
Я впервые использую пользовательскую модель, поэтому не знаю, правильно ли я использую способ входа пользователя. Пожалуйста, поправьте меня, если я ошибаюсь.
У вас возникла эта ошибка, потому что вы никогда не activate
пользователя (is_active=False) по умолчанию в CustomUser
модели.
Я также вижу, что у вас нет представления для активации нового пользователя.
Тогда вам нужно активировать пользователя при создании (registerpage
) :
def registerpage(request):
# Lot of code
if password1==password2:
user=CustomUser.objects.create_user(...)
# You don't need to call save, as create_user do it already
# user.save()
# Now active the user
user.is_active = True
user.save() # Here save() is necessary
Больше о Django User Model
ОБНОВИТЬ :
В вашем пользовательском менеджере вы установили USERNAME_FIELD = 'email'
.
Это означает, что для входа в систему вам необходимо указать email
и password
.
def loginpage(request):
if request.method == 'POST':
email = request.POST.get('email')
password = request.POST.get('paswword')
# Use eamail to authenticate instead of username
user = authenticate(request, email=email, password=password)