简体   繁体   中英

Django: Error Saving User With AbstractBaseUser and BaseUserManager

I created a custom user model and am attempting to create a new user. I've tried manage.py createsuperuser from shell as well as User.objects.create_user(email, password) in my code. Both result in the same error:

$ ./manage.py createsuperuser
Email: person@example.com
Is manager: True
Password: 
Password (again): 
Traceback (most recent call last):
  File "./manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/martin/projects/p34b2.0/lib/python3.4/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
    utility.execute()
  File "/home/martin/projects/p34b2.0/lib/python3.4/site-packages/django/core/management/__init__.py", line 330, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/martin/projects/p34b2.0/lib/python3.4/site-packages/django/core/management/base.py", line 393, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/martin/projects/p34b2.0/lib/python3.4/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 50, in execute
    return super(Command, self).execute(*args, **options)
  File "/home/martin/projects/p34b2.0/lib/python3.4/site-packages/django/core/management/base.py", line 444, in execute
    output = self.handle(*args, **options)
  File "/home/martin/projects/p34b2.0/lib/python3.4/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 149, in handle
    self.UserModel._default_manager.db_manager(database).create_superuser(**user_data)
  File "/home/martin/projects/p34b2.0/projects/basedin-2.0/apps/accounts/models.py", line 40, in create_superuser
    user = self.create_user(email, password, **kwargs)
  File "/home/martin/projects/p34b2.0/projects/basedin-2.0/apps/accounts/models.py", line 36, in create_user
    user.save()
  File "/home/martin/projects/p34b2.0/lib/python3.4/site-packages/django/db/models/base.py", line 710, in save
    force_update=force_update, update_fields=update_fields)
  File "/home/martin/projects/p34b2.0/lib/python3.4/site-packages/django/db/models/base.py", line 738, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "/home/martin/projects/p34b2.0/lib/python3.4/site-packages/django/db/models/base.py", line 803, in _save_table
    forced_update)
  File "/home/martin/projects/p34b2.0/lib/python3.4/site-packages/django/db/models/base.py", line 833, in _do_update
    filtered = base_qs.filter(pk=pk_val)
  File "/home/martin/projects/p34b2.0/lib/python3.4/site-packages/django/db/models/query.py", line 679, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/home/martin/projects/p34b2.0/lib/python3.4/site-packages/django/db/models/query.py", line 697, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "/home/martin/projects/p34b2.0/lib/python3.4/site-packages/django/db/models/sql/query.py", line 1309, in add_q
    clause, require_inner = self._add_q(where_part, self.used_aliases)
  File "/home/martin/projects/p34b2.0/lib/python3.4/site-packages/django/db/models/sql/query.py", line 1337, in _add_q
    allow_joins=allow_joins, split_subq=split_subq,
  File "/home/martin/projects/p34b2.0/lib/python3.4/site-packages/django/db/models/sql/query.py", line 1208, in build_filter
    condition = self.build_lookup(lookups, col, value)
  File "/home/martin/projects/p34b2.0/lib/python3.4/site-packages/django/db/models/sql/query.py", line 1101, in build_lookup
    return final_lookup(lhs, rhs)
  File "/home/martin/projects/p34b2.0/lib/python3.4/site-packages/django/db/models/lookups.py", line 101, in __init__
    self.rhs = self.get_prep_lookup()
  File "/home/martin/projects/p34b2.0/lib/python3.4/site-packages/django/db/models/lookups.py", line 139, in get_prep_lookup
    return self.lhs.output_field.get_prep_lookup(self.lookup_name, self.rhs)
  File "/home/martin/projects/p34b2.0/lib/python3.4/site-packages/django/db/models/fields/__init__.py", line 727, in get_prep_lookup
    return self.get_prep_value(value)
  File "/home/martin/projects/p34b2.0/lib/python3.4/site-packages/django/db/models/fields/__init__.py", line 985, in get_prep_value
    return int(value)
ValueError: invalid literal for int() with base 10: 'person@example.com'

My model/manager:

class UserManager(BaseUserManager):
    def create_user(self, email, password, **kwargs):
        if not email:
            raise ValueError('Users must have an email address')

        user = self.model(self.normalize_email(email), **kwargs)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password, **kwargs):
        user = self.create_user(email, password, **kwargs)
        user.is_admin = True
        user.save(using=self._db)
        return user


class User(AbstractBaseUser, PermissionsMixin, EditMixin):
    email = models.EmailField(max_length=255, unique=True)
    business_access = models.ManyToManyField(BusinessAccess, blank=True)
    auth_key = models.UUIDField(unique=True, max_length=64, default=uuid.uuid4)
    is_manager = models.BooleanField(default=False)

    REQUIRED_FIELDS = ['is_manager']
    USERNAME_FIELD = 'email'
    objects = UserManager()

    class Meta:
        verbose_name = "User"
        verbose_name_plural = "Users"

    def __str__(self):
        return self.email

    def get_full_name(self):
        return self.email

    def get_short_name(self):
        return self.email

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

Am I doing something wrong?

Try this for the create_user method in the Manager

def _create_user(self, email, password,
                 is_staff, is_superuser, **extra_fields):
    """
    Creates and saves a User with the given email and password.
    """
    now = timezone.now()
    if not email:
        raise ValueError('The given email must be set')
    email = self.normalize_email(email)
    user = self.model(email=email,
                      is_staff=is_staff, is_active=True,
                      is_superuser=is_superuser, last_login=now,
                      date_joined=now, **extra_fields)
    user.set_password(password)
    user.save(using=self._db)
    return user

def create_user(self, email, password=None, **extra_fields):
    return self._create_user(email, password, False, False,
                             **extra_fields)

def create_superuser(self, email, password, **extra_fields):
    return self._create_user(email, password, True, True,
                             **extra_fields)

I tried your example and also ran into the same error. This is my implementation which works correctly without any problem

您需要写,这对我有帮助:

self.model(email=self.normalize_email(email), **kwargs)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM