0

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 日間しっかりと費やしましたが、残念ながら役に立ちませんでした。誰かがこれを理解するのを手伝ってくれてとても感謝しています。

編集:インデントを修正しましたが、エラーは解決しません

4

2 に答える 2

0

インデントが間違っているようです。get_by_natural_key()は関数であり、マネージャー クラスのメソッドではありません。

于 2017-10-18T04:03:54.590 に答える