custom django-user object has no attribute 'has_module_perms'
Your User implementation is not providing the mandatory methods to be used with the Admin module.
See https://docs.djangoproject.com/en/3.0/ref/contrib/admin/#module-django.contrib.admin.
In your case, add the permissions mixin (PermissionsMixin), as a superclass of your model:
from django.contrib.auth.models import PermissionsMixinclass MyUser(AbstractBaseUser, PermissionsMixin): # ...
It is described here : https://docs.djangoproject.com/en/3.0/topics/auth/customizing/#custom-users-and-permissions.
It works with Django 1.x, 2.x and 3.0.
EDIT: updated links to django version 3.0
I think your model is missing some attributes such as 'has_module_params'...Try to add the following
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
For those who are just stepping in November 2017 and after, I don't think adding or allowing your class to inherit PermissionsMixin
is the way out, being that it will raise more error since you have reinvented the wheel.
I ran into the same problem this afternoon (4th Nov, 2017) having override Username
with 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
So, http://127.0.0.1:8000/admin/
wasn't working and kept raising object has no attribute 'has_module_perms'
error, the following is how I fixed mine:
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
I hope this helps someone.