Расширил базовый User, используя AbstractBaseUser, но при регистрации пароль не хешируется

я создал базовый user используя AbstractBaseUser, создал свой UserManager и добавил его в новой модели user. при регистрации с помощью createsuperuser все идет нормально, но, если я вручную создаю пользователя, его пароль не хешируется.

managers.py

from django.contrib.auth.base_user import BaseUserManager


class UserManager(BaseUserManager):
    use_in_migrations = True

def _create_user(self, username=None, email=None, phone=None, \
                 password=None, **extra_fields):
    """
    Creates and saves a User with the given email and password.
    """
    if not username:
        if not email and not phone:
            raise ValueError('The given email/phone must be set')

    if email:
        email = self.normalize_email(email)

        if not username:
            username = email

        user = self.model(
            email=email,
            username=username,
            **extra_fields
        )

    if phone:
        if not username:
            username = phone

        user = self.model(
            username=username,
            phone=phone,
            **extra_fields
        )

    # проверяем является ли пользователь
    # суперпользователем
    if extra_fields.get('is_superuser'):
        user = self.model(
            username=username,
            **extra_fields
        )

    user.set_password(password)
    user.save(using=self._db)
    return user

def create_user(self, username, email, password=None, **extra_fields):
    extra_fields.setdefault('is_superuser', False)
    return self._create_user(username=username, email=email, password=password, **extra_fields)

def create_superuser(self, username, password, **extra_fields):
    extra_fields.setdefault('is_superuser', True)
    extra_fields.setdefault('is_staff', True)
    extra_fields.setdefault('is_active', True)

    if extra_fields.get('is_superuser') is not True:
        raise ValueError('Superuser must have is_superuser=True.')

    return self._create_user(
        username=username,
        password=password,
        **extra_fields
    )

models.py

from django.db import models
from django.contrib.auth.models import PermissionsMixin
from django.contrib.auth.base_user import AbstractBaseUser

# from django.utils.translation import ugettext_lazy as _


from custumuser.managers import UserManager


class User(AbstractBaseUser, PermissionsMixin):
    username = models.CharField(verbose_name='username',
                                max_length=255,
                                unique=True
                                )
    email = models.EmailField(verbose_name='email address',
                              null=True,
                              blank=True
                              )
    phone = models.CharField(verbose_name='phone number',
                             max_length=30,
                             null=True,
                             blank=True
                             )
    date_joined = models.DateTimeField(verbose_name='date joined',
                                       auto_now_add=True
                                       )
    is_active = models.BooleanField(verbose_name='active',
                                    default=False
                                    )
    is_staff = models.BooleanField(verbose_name='staff',
                                   default=False
                                   )
    FIO = models.CharField(max_length=255,
                           verbose_name='FIO',
                           blank=True,
                           null=True,
                           )
    ROLES = (
        ('L1', 'Начальник ПКО'),
        ('L2', 'Проектный отдел'),
        ('L3', 'ПТО'),
        ('L4', 'Тех.директор'),
        ('L5', 'ОРД'),
        ('L6', 'ГД'),
        ('L7', 'Радист'),
    )
    roles = models.CharField(choices=ROLES,
                             max_length=2,
                             blank=True,
                             null=True,
                             verbose_name='roles',
                             )

    is_verified = models.BooleanField(verbose_name='verified',
                                      default=False
                                      )

    objects = UserManager()

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']

    class Meta:
        verbose_name = 'user'
        verbose_name_plural = 'users'
        unique_together = ('username', 'phone')

    def __str__(self):
        return self.username

я предполагаю что не срабатывает objects = UserManager() из модели. но я не знаю почему

Порылся в старых пет проектах где я ловил туже проблему при изучении AbstractBaseUser. Попробуйте использовать make_password это должно захешировать пароль когда вы создаёте объект.

from django.contrib.auth.hashers import make_password

return self._create_user(username=username, email=email, password= make_password(password)), **extra_fields)
Вернуться на верх