電子メールによるログイン用のカスタムユーザーモデル:
class MyUser(AbstractBaseUser):
id = models.AutoField(primary_key=True) # AutoField?
is_superuser = models.IntegerField(default=False)
username = models.CharField(unique=True,max_length=30)
first_name = models.CharField(max_length=30, default='')
last_name = models.CharField(max_length=30, default='')
email = models.EmailField(unique=True,max_length=75)
is_staff = models.IntegerField(default=False)
is_active = models.IntegerField(default=False)
date_joined = models.DateTimeField(default=None)
# Use default usermanager
objects = UserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
class Meta:
db_table = 'auth_user'
そのために、スーパーユーザーを正常に作成することができます。ただし、電子メールとパスワードを使用してログインしようとすると、次のエラーが発生します。
'MyUser' object has no attribute 'has_module_perms'
私が間違っていることについて何か考えはありますか?
ユーザー実装は、管理モジュールで使用される必須のメソッドを提供していません。
https://docs.djangoproject.com/en/3.0/ref/contrib/admin/#module-Django.contrib.admin を参照してください。
あなたの場合、モデルのスーパークラスとしてパーミッションミックスイン(PermissionsMixin)を追加します。
from Django.contrib.auth.models import PermissionsMixin
class MyUser(AbstractBaseUser, PermissionsMixin):
# ...
ここで説明されています: https://docs.djangoproject.com/en/3.0/topics/auth/customizing/#custom-users-and-permissions 。
Django 1.x、2.x、3.0で動作します。
編集:Djangoバージョン3.0へのリンクを更新
モデルに「has_module_params」などの属性が欠落していると思います...次を追加してみてください
class MyUser(AbstractBaseUser):
...
...
def has_perm(self, perm, obj=None):
return self.is_superuser
def has_module_perms(self, app_label):
return self.is_superuser
2017年11月以降に足を踏み入れたばかりの人にとっては、クラスにPermissionsMixin
を追加または継承させることは、車輪の再発明を行ったためにエラーが増えるため、解決策ではないと思います。
私は今日の午後(2017年11月4日)にUsername
をPhone Number
でオーバーライドするという同じ問題に遭遇しました。
class MyUserManager(BaseUserManager):
..
..
def create_superuser(self, phone, password=None):
if password is None:
raise TypeError("provide password please")
myuser = self.model(phone=phone)
myuser.set_password(password)
myuser.is_admin = True
myuser.is_staff = True
myuser.save()
return myuser
そのため、http://127.0.0.1:8000/admin/
が機能せず、object has no attribute 'has_module_perms'
エラーが発生し続けました。以下は、私の修正方法です。
class MyUser(AbstractBaseUser):
..
..
def get_full_name(self):
pass
def get_short_name(self):
pass
@property
def is_superuser(self):
return self.is_admin
@property
def is_staff(self):
return self.is_admin
def has_perm(self, perm, obj=None):
return self.is_admin
def has_module_perms(self, app_label):
return self.is_admin
@is_staff.setter
def is_staff(self, value):
self._is_staff = value
これが誰かに役立つことを願っています。