Создание суперпользователя без пароля

Я реализовал пользовательского пользователя следующим образом:

class UserManager(BaseUserManager):

    def _create_user(self, email, username, shop, number, is_superuser, total_points, used_points, is_staff, **extra_fields):
        if not username and (is_superuser or not number or not shop):
            raise ValueError('Users must have a username')
        now = timezone.now()
        email = self.normalize_email(email)
        user = self.model(
            username=username,
            email=email,
            shop=shop,
            number=number,
            is_superuser=is_superuser,
            total_points=total_points,
            used_points=used_points,
            last_login=now,
            date_joined=now,
            is_staff=is_staff,
            **extra_fields
        )
        user.save(using=self._db)
        return user

    def get_by_natural_key(self, username):
        return self.get(**{'{}__iexact'.format(self.model.USERNAME_FIELD): username})

    def create_user(self, email, username, shop, number,  is_superuser, total_points, used_points, is_staff, **extra_fields):
        return self._create_user(email, username, shop, number, is_superuser, total_points, used_points, is_staff, **extra_fields)

    def create_superuser(self, email, username, password=None):
        user = self.model(email=email, username=username,  shop=None, is_superuser=True, total_points=0, used_points=0,
                          is_staff=True)
        user.is_superuser = True
        user.is_staff = True
        user.shop = Shop.objects.create(name="openformat")
        user.save(using=self._db)
        return user


class AbstractUser(AbstractBaseUser):
    uid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    username = models.CharField(max_length=64, unique=True)
    email = models.EmailField()
    number = models.CharField(max_length=20)
    is_superuser = models.BooleanField(default=False)
    date_joined = models.DateTimeField(auto_now_add=True)
    last_login = models.DateTimeField(null=True, blank=True)
    is_staff = models.BooleanField(default=False)

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

    class Meta:
        abstract = True


class User(AbstractUser, PermissionsMixin):

    shop = models.ForeignKey(Shop, null=False, blank=False, on_delete=models.CASCADE)
    total_points = models.IntegerField(default=0)
    used_points = models.IntegerField(default=0)

    objects = UserManager()

    def get_absolute_url(self):
        return "/users/%i/" % (self.uid)

    def has_perm(self, perm, obj=None):
        return self.is_superuser

    def get_full_name(self):
        return self.username

    def get_short_name(self):
        return self.username

    def __str__(self):
        return self.username

Как вы можете видеть, у меня нет поля пароля для пользовательского пользователя. Я не хочу иметь поле пароля и для администратора.

Проблемы

  1. createsuperuser все еще запрашивает пароль
  2. Поскольку я создаю суперпользователя без пароля в функции create_superuser, я не могу войти в панель администратора (пароль не совпадает)

Есть ли способ иметь суперпользователя без пароля?

ИЛИ

Можно ли иметь поле password в модели User и оно является нулевым для всех пользователей, кроме администратора?

Я очень новичок в Django. Поэтому, возможно, это очень "глупый" вопрос.

пароль обязателен, если вы хотите использовать django auth, если вы не хотите, я предложу одну плохую идею, которая заключается в переопределении django auth https://stackoverflow.com/a/27682268/9501611

Вернуться на верх