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 日間しっかりと費やしましたが、残念ながら役に立ちませんでした。誰かがこれを理解するのを手伝ってくれてとても感謝しています。
編集:インデントを修正しましたが、エラーは解決しません