2017-10-18 69 views
0

我有延伸的AbstractBaseUser自定义的用户模型,以及我自己的用户管理器(GenericUserManager):Dajngo自定义用户错误

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天时间才梳理出本网站上的其他问题,但不幸的是,它没有帮助。我会非常感激,有人可以帮我弄清楚这一点。

编辑:固定的缩进,但错误依然存在

+0

功能必须是类 –

+0

内你在哪里调用你的get_by_natural_key?在views.py文件? –

回答

0

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

0

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

+0

谢谢你的回复。我已经修复了缩进,但问题仍然存在。我认为当我将代码放入堆栈溢出时,可能会发生缩进,因为我自己的代码具有正确的缩进。 –

+0

对不起,@LeanderHach,我看不到你想做什么。如果您可以包含完整的,可运行的代码示例,这将会很有帮助。我创建了[udjango](https://github.com/donkirkby/udjango)作为发布Django代码的可运行示例的一种方式。看看它是否有助于解决这个问题。 –