自定义django-user对象没有属性'has_module_perms'

时间:2015-07-12 17:05:20

标签: django django-authentication django-users

我通过电子邮件登录的自定义用户模型:

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'

知道我做错了吗?

3 个答案:

答案 0 :(得分:20)

您的用户实现未提供与管理模块一起使用的强制方法。

请参阅https://docs.djangoproject.com/en/1.8/ref/contrib/admin/#module-django.contrib.admin

在您的情况下,只需添加权限mixin(PermissionsMixin),作为模型的超类。

from django.contrib.auth.models import PermissionsMixin


class MyUser(AbstractBaseUser, PermissionsMixin):
     # ...

这里描述:https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#custom-users-and-permissions

答案 1 :(得分:9)

我认为您的模型缺少某些属性,例如' has_module_params' ...尝试添加以下内容

  $(document).ready(function() {
    $("#test-list").sortable({
      handle : '.handle',
      start: function(){
          $("#success-result").html("loading....");
      },
      update : function () { 

          var order = $('#test-list').sortable('serialize');
        $("#success-result").load("<?php echo base_url('explorer/processSortable'); ?>?"+order);
      }
    });

答案 2 :(得分:3)

对于那些刚刚在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

我希望这有助于某人。