【问题标题】:Django custom user errorDjango自定义用户错误
【发布时间】:2017-10-18 03:44:03
【问题描述】:

我有一个扩展 AbstractBaseUser 的自定义用户模型,以及我自己的用户管理器 (GenericUserManager):

class GenericUserManager(BaseUserManager):
    def create_user(self, username, email, password, key_expires):
        if not email:
            raise ValueError('Users must have an email address')

        if not username:
            raise ValueError("users must have a username")

        if not password:
            raise ValueError('users must have password')

        user = self.model(
            username=username,
            email=self.normalize_email(email),
            key_expires=key_expires,
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def get_by_natural_key(self, username):
       return self.get(username=username)

class BaseRegistrationUser(AbstractBaseUser):
     username = models.CharField(max_length=150, unique=True)
     email = models.EmailField(
            verbose_name='email address',
            max_length=255,
            unique=False,
        )
     activation_key = models.CharField(max_length=90)
     key_expires = models.DateTimeField()
     is_active = models.BooleanField(default=False)
     is_admin = models.BooleanField(default=False)
     date_joined = models.DateTimeField(('date joined'), 
     default=datetime.datetime.now)
     is_merchant_or_customer = models.CharField(max_length=20, null=False)

     USERNAME_FIELD = 'username'
     REQUIRED_FIELDS = ['username, email']

     def __str__(self):
        return self.username

     ...

     def natural_key(self):
        return (self.email,)

     ...
class Customer(BaseRegistrationUser):
    first_name = models.CharField(max_length=150, default="", null=True)
    last_name = models.CharField(max_length=150, default="", null=True)
    slug = models.SlugField(max_length=175, default="", null=True)

    objects = GenericUserManager()
    ...

这些可以很好地用于注册目的,但是,每当我尝试登录“客户”用户时,我都会收到以下错误:

File "C:\Users\OEM\Documents\repos\repo\ecommerce\myapp\views.py" in get_profile
  126.     user = authenticate(username=username, password=password)

File "C:\Users\OEM\AppData\Local\Programs\Python\Python36-32\lib\site-
packages\django\contrib\auth\__init__.py" in authenticate
  70.             user = _authenticate_with_backend(backend, backend_path, 
request, credentials)

File "C:\Users\OEM\AppData\Local\Programs\Python\Python36-32\lib\site-
packages\django\contrib\auth\__init__.py" in _authenticate_with_backend
  115.     return backend.authenticate(*args, **credentials)

File "C:\Users\OEM\AppData\Local\Programs\Python\Python36-32\lib\site-
packages\django\contrib\auth\backends.py" in authenticate
  18.             user = 
UserModel._default_manager.get_by_natural_key(username)

Exception Type: AttributeError at /get-profile/
Exception Value: 'Manager' object has no attribute 'get_by_natural_key'

我不知道是什么原因造成的,因为“get_by_natural_key”属性是在我的 UserManager 中定义的。

我已经尝试过新的数据库迁移,并花了整整 3 天时间来梳理此站点上的其他问题,但不幸的是,它没有帮助。我将非常感谢有人能帮我解决这个问题。

编辑:修复了缩进,但错误仍然存​​在

【问题讨论】:

  • 函数必须在类内
  • 你在哪里调用你的 get_by_natural_key ?在views.py 文件中?

标签: django django-custom-user django-custom-manager


【解决方案1】:

看起来你的缩进是错误的。 get_by_natural_key() 是一个函数,而不是你的管理器类的方法。

【讨论】:

  • 感谢您的回复。我已经修复了缩进,但问题仍然存在。我认为当我将代码放入堆栈溢出时可能刚刚发生缩进,因为我自己的代码具有正确的缩进。
  • 对不起,@LeanderHach,我看不出你在做什么。如果您可以包含一个完整的、可运行的代码示例,将会很有帮助。我创建了 udjango 作为发布 Django 代码可运行示例的一种方式。看看它是否有助于解决这个问题。
【解决方案2】:

好的,事后看来,解决方案应该更明显。我正确地为客户分配了我的user manager 类,但是,我没有将同样的方法应用到我的BaseRegistrationUser,这意味着它缺少使用 django.auth 方法登录所需的方法

【讨论】:

    猜你喜欢
    • 2013-07-27
    • 1970-01-01
    • 2015-05-01
    • 2017-07-13
    • 2021-10-21
    • 1970-01-01
    • 2012-07-03
    • 2014-05-11
    • 2016-09-27
    相关资源
    最近更新 更多