Создание суперпользователя без пароля
Я реализовал пользовательского пользователя следующим образом:
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
Как вы можете видеть, у меня нет поля пароля для пользовательского пользователя. Я не хочу иметь поле пароля и для администратора.
Проблемы
createsuperuser
все еще запрашивает пароль- Поскольку я создаю суперпользователя без пароля в функции
create_superuser
, я не могу войти в панель администратора (пароль не совпадает)
Есть ли способ иметь суперпользователя без пароля?
ИЛИ
Можно ли иметь поле password
в модели User
и оно является нулевым для всех пользователей, кроме администратора?
Я очень новичок в Django. Поэтому, возможно, это очень "глупый" вопрос.
пароль обязателен, если вы хотите использовать django auth, если вы не хотите, я предложу одну плохую идею, которая заключается в переопределении django auth https://stackoverflow.com/a/27682268/9501611