Не могу зайти на cайт администратора
Я создал пользовательскую модель, и когда я создаю суперпользователя с помощью консоли, то мне пишет: "Superuser created successfully", но после этого я захожу на сайт администратора и не могу войти за теми данными, которые я ввел при создании пользователя.
Модель пользователя:
class CustomUserManager(BaseUserManager):
def create_user(self, username, email, password, **other_fields):
other_fields.setdefault("is_staff", False)
other_fields.setdefault("is_superuser", False)
user = self.model(
username=username,
email=self.normalize_email(email),
**other_fields
)
user.set_password = password
user.save(using=self._db)
return user
def create_superuser(self, email, username, password, **other_fields):
other_fields.setdefault('is_staff', True)
other_fields.setdefault('is_superuser', True)
user = self.create_user(
username=username,
email=email,
password=password,
**other_fields
)
if other_fields.get("is_staff") is not True:
raise ValueError("Superuser must have is_staff=True.")
if other_fields.get("is_superuser") is not True:
raise ValueError("Superuser must have is_superuser=True.")
user.save(using=self._db)
return user
class CustomUser(AbstractBaseUser, PermissionsMixin):
username = models.CharField(
verbose_name='Username', db_index=True, max_length=16,
help_text='Enter your username', unique=True
)
first_name = models.CharField(verbose_name='First name', max_length=20, help_text='Enter your name', null=True)
last_name = models.CharField(verbose_name='Last name', max_length=20, help_text='Enter your surname')
email = models.EmailField(verbose_name='Email', help_text='Enter your email', unique=True)
sex = models.CharField(
verbose_name='Sex', max_length=6,
choices=[('Female', 'Female'), ('Male', 'Male')], null=True
)
password = models.CharField(
verbose_name='Password', max_length=16,
help_text='Enter your password'
)
date_joined = models.DateTimeField(verbose_name="date joined", default=timezone.now, editable=False)
is_staff = models.BooleanField(verbose_name='Staff', default=False)
is_active = models.BooleanField(default=True)
is_superuser = models.BooleanField(verbose_name='Superuser', default=False)
USERNAME_FIELD = 'email'
EMAIL_FIELD = 'email'
REQUIRED_FIELDS = ['username']
objects = CustomUserManager()
class Meta:
verbose_name = _('user')
verbose_name_plural = _('users')
def get_full_name(self):
return '{0} {1}'.format(self.first_name, self.last_name)
def short_name(self):
return self.first_name
def __str__(self):
return self.username
def email_user(self, subject, message, from_email=None, **kwargs):
send_mail(subject, message, from_email, [self.email], **kwargs)
Настройки:
INSTALLED_APPS = [
'users',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'catalog'
]
AUTH_USER_MODEL = 'users.CustomUser'
AUTHENTICATION_BACKENDS = ['users.backends.Authentication']
Cкрин из бд:
Я пытался вставлять пароль прямо в бд, но мне это не помогло.
У меня password
и email
в функци authenticate
возращали None
(я думал туда передаються данные ввода), мне пришлось брать данные полей ввода с помощью параметра request
.
class Authentication(ModelBackend):
def authenticate(self, request, email=None, password=None, **kwargs):
if email is None or password is None:
email = request.POST['username']
password = request.POST['password']
try:
user = CustomUser.objects.get(email=email)
except ObjectDoesNotExist:
return None
else:
hash_paswword = user.password
check = check_password(password, hash_paswword)
if check and self.user_can_authenticate(user):
return user
print('Not correct password')
return None
или
class Authentication(ModelBackend):
def authenticate(self, request,email=None,password=None, **kwargs):
User = get_user_model()
if email is None or password is None:
email = request.POST['username']
password = request.POST['password']
try:
user = User._default_manager.get_by_natural_key(email)
except User.DoesNotExist:
User().set_password(password)
else:
if user.check_password(password) and self.user_can_authenticate(user):
return user
Не знаю можно ли по-другому сделать.