0

Here is my custom User model for my django project.

class User(AbstractBaseUser, PermissionsMixin):
phone = models.CharField(
    max_length=15,
    unique=True,
)
sms = models.BooleanField(default=True)
active = models.BooleanField(default=True)
staff = models.BooleanField(default=False)
admin = models.BooleanField(default=False)
tutor = models.ForeignKey(
    'self',
    on_delete=models.SET_NULL,
    blank=True,
    null=True,
)
TRAINING_ONLINE = 'ON'
TRAINING_DISTANCE = 'DT'
TRAINING_FULLTIME = 'FT'
TRAINING_NONE = 'NN'
TRAINING_CHOICES = (
    (TRAINING_ONLINE, 'Online'),
    (TRAINING_DISTANCE, 'Distance'),
    (TRAINING_FULLTIME, 'Fulltime'),
    (TRAINING_NONE, 'None'),
)
training = models.CharField(
    max_length=2,
    choices=TRAINING_CHOICES,
    default=TRAINING_NONE,
)
first_name = models.CharField(
    max_length=50,
    blank=True,
    null=True,
)
last_name = models.CharField(
    max_length=50,
    blank=True,
    null=True,
)
country = models.CharField(
    max_length=50,
    blank=True,
)
city = models.CharField(
    max_length=50,
    blank=True,
)
EFFICIENCY_VERY_LOW = '1'
EFFICIENCY_LOW = '2'
EFFICIENCY_MEDIUM = '3'
EFFICIENCY_HIGH = '4'
EFFICIENCY_VERY_HIGH = '5'
EFFICIENCY_CHOICES = (
    (EFFICIENCY_VERY_LOW, 'Very low'),
    (EFFICIENCY_LOW, 'Low'),
    (EFFICIENCY_MEDIUM, 'Medium'),
    (EFFICIENCY_HIGH, 'High'),
    (EFFICIENCY_VERY_HIGH, 'Very high'),
)
efficiency = models.CharField(
    max_length=1,
    choices=EFFICIENCY_CHOICES,
    default=EFFICIENCY_MEDIUM,
)
USERNAME_FIELD = 'phone'
REQUIRED_FIELDS = []

def __str__(self):
    return self.phone

def get_full_name(self):
    return self.first_name + ' ' + self.last_name

def get_short_name(self):
    return self.first_name

@property
def is_staff(self):
    return self.staff

@property
def is_admin(self):
    return self.admin

@property
def is_active(self):
    return self.active

I've seen some tutorials with **extra_fields, but I don't really know how to use it correctly to reduce the amount of unnecessary code.

I don't know how to correctly write custom UserManager for it. Should I set default values or it is already done by module? Could you help me please?


I need authentication by phone number and password. I also need to store in the database some additional information about users (their first and last names and so on). Unnecessary code is something like this:

def create_user(self, phone=None, first_name=None, password=None, sms=True, active=True, staff=False, admin=False, tutor=None, training='NN', efficiency='3', last_name=None, country=None, city=None):

I want to redefine (not extend!) standard Django User model by using AbstractBaseUser

  • 2
    Your question is unclear. What "unnecessary code" are you talking about? Why do you think you need a custom UserManager, and what do you want it to do? – Daniel Roseman Feb 26 '19 at 18:08
  • Is this a duplicate of https://stackoverflow.com/questions/16606312/django-custom-user-model-and-usermanager or https://stackoverflow.com/questions/39096052/how-can-i-implement-custom-user-manager-in-django or https://stackoverflow.com/questions/6518280/override-usermanager-in-django – Richard Chambers Feb 26 '19 at 22:04

1 Answers1

0

class UserOtherInfo(models.Model):

'''
To extend basic user model (for users extra informations)
'''
user            = models.OneToOneField(User , on_delete=models.CASCADE)
phone           = models.CharField('Phone Number', max_length=15,null=True,blank=True)

''' here you can add as much fields as you want '''

Divakar Yadav
  • 107
  • 2
  • 11