Reputation: 185
I am trying to define my own user module by following the documentation, but I receive the following error message whenever I try to create my first super user.
TypeError: create_superuser() got an unexpected keyword argument 'password'
Some people seem to have solved it by commenting user.is_staff and user.is_admin but it didn't work for me.
Any suggestions?
My models.py
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
# Create your models here.
class MyAccountManager(BaseUserManager):
def create_user(self, email, first_name, last_name, password=None):
if not email:
raise ValueError("Users must have an email address")
if not first_name or last_name:
raise ValueError("Users must have a first and last name")
user = self.model(
email=self.normalize_email(email),
first_name=first_name,
last_name=last_name,
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, first_name, last_name):
user = self.create_user(
email=self.normalize_email(email),
password=password,
first_name=first_name,
last_name=last_name,
)
#user.is_staff = True
user.is_superuser = True
#user.is_admin = True
user.save(using=self._db)
return user
class Account(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(verbose_name="email", max_length=60, unique=True)
date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
last_login = models.DateTimeField(verbose_name='last login', auto_now_add=True)
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
# Stupid name in Django - Basically is the "Login field"
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['first_name', 'last_name']
objects = MyAccountManager()
def __str__(self):
return self.email
def has_perm(self, perm, obj=None):
return self.is_admin
def has_module_perms(self, app_label):
return True
Upvotes: 1
Views: 1340
Reputation: 2102
Add password to create_superuser
's arguments:
def create_superuser(self, email, first_name, last_name, password):
Notice you are using self
in user = self.create_user(**fields)
so your function should have password arg too.
Upvotes: 3
Reputation: 452
Where you have the method:
def create_superuser(self, email, first_name, last_name):
user = self.create_user(
email=self.normalize_email(email),
password=password,
first_name=first_name,
last_name=last_name,
)
#user.is_staff = True
user.is_superuser = True
#user.is_admin = True
user.save(using=self._db)
return user
Do not do password=password
in the self.create_user
method.
Rather, do the following:
user = self.create_user(
email=self.normalize_email(email),
first_name=first_name,
last_name=last_name
)
user.set_password(password)
That method would take care of the password hashing and set it accordingly.
Upvotes: 1
Reputation: 113
add password as argument in create_superuser body
def create_superuser(self, email, password, first_name, last_name):
user = self.model(
email=self.normalize_email(email),
password=password,
first_name=first_name,
last_name=last_name,
)
and I suggest to use the Django method user.set_password(user.password)
before save because it hashes the password for you
def create_superuser(self, password, email, first_name, last_name):
user = self.model(
email=self.normalize_email(email),
password=password,
first_name=first_name,
last_name=last_name,
)
user.set_password(user.password)
#user.is_staff = True
user.is_superuser = True
#user.is_admin = True
user.save(using=self._db)
return user
Upvotes: 2