I have implemented custom user as follows:
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
As you can see, I do not have a password field for the custom user. I do not want to have a password field for the admin as well.
Problems
createsuperuser
still asking for a password- Because I am creating a superuser without a password in
create_superuser
function, I cannot log in admin panel (the password does not match)
Is there a way to have a superuser without password?
OR
Is it ok to have password
field in User
model and it is null for all users except admin?
I am very new to Django. So, this might be a very "stupid" question.