Ken1995
Ken1995

Reputation: 209

Creating superuser in django

I modified the user model as shown below, to make users log in via phone.

from django.db import models
import datetime
from django.core.mail import send_mail
from django.contrib.auth.models import (
    AbstractBaseUser, BaseUserManager
)
from django.contrib.staticfiles.templatetags.staticfiles import static

from django.core.validators import RegexValidator



class UserManager(BaseUserManager):

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

def create_user(self,phone_number,password=None,is_staff=False,is_active = True, is_admin = False, is_vendor = False):

    if not phone_number:
        raise ValueError("Users Must Have a phone number")
    if not password:
        raise ValueError("Users must have a password")
    user = self.model(
        phone_number )

    user.set_password(password)
    user.is_staff = is_staff
    user.is_active = is_active
    user.is_admin = is_admin
    user.is_vendor = is_vendor
    user.save(using=self._db)
    return user

def create_staffuser(self,phone_number, password=None):
    user = self.create_user(
    phone_number,
    password=password,
    is_staff=True
    )
    return user
def create_superuser(self,phone_number, password=None):
    user = self.create_user(
    phone_number,
    password=password,
    is_admin=True,
    is_staff=True
    )
    return user
def create_vendoruser(self,phone_number, password=None):
    user = self.create_user(
    phone_number,
    password=password,
    is_vendor=True
    )
    return user



class User(AbstractBaseUser):
    phone_number = models.CharField(max_length=20, unique=True)
    date_joined = models.DateField(auto_now_add = True)
    is_active = models.BooleanField(default = True)
    is_staff = models.BooleanField(default = False)
    is_admin = models.BooleanField(default = False)
    is_vendor = models.BooleanField(default = False)
    is_basic = models.BooleanField(default = False)

 REQUIRED_FIELDS = []

objects = UserManager()

def __str__(self):
    return self.phone_number

# def save(self, *args, **kwargs):
#     self.email = self.email.lower()
#     return super(User, self).save(*args, **kwargs)

def get_full_name(self):
    return self.phone_number

def get_short_name(self):
    return self.phone_number

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

def has_module_perms(self, app_label):
    return True

def get_type(self):
    if self.vendor:
        return self.vendor_user
    else:
        return self.basic_user

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

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

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

@property
def vendor(self):
    return self.is_vendor

@property
def basic(self):
    return self.is_basic




USERNAME_FIELD = 'phone_number'

Then I created a superuser and tried to log in, but couldn't. Upon checking the database from the python shell, I realized that the database had an empty phone number field for the superuser I created.

So the problem is: phone number is not properly saving when I create superuser

Upvotes: 2

Views: 612

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 476537

In your code you write:

user = self.model(phone_number)

(reformatted)

But if you create a model instance, all parameters must be named parameters (since fields are unordered, it would make it very hard to know where the values would "land"). So you have to specify the field name you want to update:

user = self.model(phone_number=phone_number)

Upvotes: 2

Related Questions