Django:使用AbstractBaseUser和BaseUserManag保存用户时出错

2024-04-18 07:05:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个自定义用户模型,并试图创建一个新用户。我尝试过shell中的manage.py createsuperuser,以及代码中的User.objects.create_user(email, password)。两者都会导致相同的错误:

$ ./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'

我的模特/经理:

^{pr2}$

我做错什么了吗?在


Tags: djangoinpyselfhomedbbasemodels
2条回答

对管理器中的create_user方法尝试此操作

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)

我试过你的例子,也遇到了同样的错误。这是我的实现,它正常工作,没有任何问题

你需要写,这有助于我:

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

相关问题 更多 >