web-dev-qa-db-ja.com

カスタムDjango-ユーザーオブジェクトには属性がありません 'has_module_perms'

電子メールによるログイン用のカスタムユーザーモデル:

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'

私が間違っていることについて何か考えはありますか?

17
Saurabh Verma

ユーザー実装は、管理モジュールで使用される必須のメソッドを提供していません。

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へのリンクを更新

24
gpichot

モデルに「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
10
Bogdan Goie

2017年11月以降に足を踏み入れたばかりの人にとっては、クラスにPermissionsMixinを追加または継承させることは、車輪の再発明を行ったためにエラーが増えるため、解決策ではないと思います。

私は今日の午後(2017年11月4日)にUsernamePhone 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

これが誰かに役立つことを願っています。