title: Django rest auth login and registration failure
body: <p>I am building a new Djnago application. I am using django-rest-auth (<a href="http://django-rest-auth.readthedocs.io/en/latest/index.html" rel="nofollow">http://django-rest-auth.readthedocs.io/en/latest/index.html</a>) for login and registration. However there is some problem with it. </p>
  
  <p>The exact problem is: </p>
  
  <ol>
  <li>For login: login is unsuccessful when I try to login through API using both Form and raw data options. It gives <code>"non_field_errors": ["User account is disabled."]</code> error.</li>
  <li>For registration: When I fill in the data and do register it gives me error however data is saved in the database.</li>
  </ol>
  
  <p>Now I have done quite a few things, and I am not sure what I have done wrong, I did things in the following order</p>
  
  <ol>
  <li>A fresh Django rest project created</li>
  <li><p>Created an app called myauth to have a custom user model, it looks as follows:</p>
  
  <pre><code>class UserManager(BaseUserManager):
  
  def _create_user(self, username, email, password, is_staff, is_superuser, **extra_fields):
  now = timezone.now()
  if not username:
   raise ValueError(_('The given username must be set'))
  email = self.normalize_email(email)
  user = self.model(username=username, email=email,
       is_staff=is_staff, is_active=False,
       is_superuser=is_superuser, last_login=now,
       date_joined=now, **extra_fields)
  user.set_password(password)
  user.save(using=self._db)
  return user
  
  def create_user(self, username, email=None, password=None, **extra_fields):
  return self._create_user(username, email, password, False, False,
           **extra_fields)
  
  def create_superuser(self, username, email, password, **extra_fields):
  user=self._create_user(username, email, password, True, True,
           **extra_fields)
  user.is_active=True
  user.save(using=self._db)
  return user
  
  
  class User(AbstractBaseUser, PermissionsMixin):
     username = models.CharField(_('username'), max_length=30, unique=True,
     help_text=_('Required. 30 characters or fewer. Letters, numbers and @/./+/-/_ characters'),
     validators=[
     validators.RegexValidator(re.compile('^[\w.@+-]+$'), _('Enter a valid username.'), _('invalid'))
     ])
     first_name = models.CharField(_('first name'), max_length=30, blank=True, null=True)
     last_name = models.CharField(_('last name'), max_length=30, blank=True, null=True)
     email = models.EmailField(_('email address'), max_length=255, unique=True)
     is_staff = models.BooleanField(_('staff status'), default=False,
     help_text=_('Designates whether the user can log into this admin site.'))
     is_active = models.BooleanField(_('active'), default=False,
     help_text=_('Designates whether this user should be treated as active. Unselect this instead of deleting accounts.'))
     date_joined = models.DateTimeField(_('date joined'), default=timezone.now)
     receive_newsletter = models.BooleanField(_('receive newsletter'), default=False)
     birth_date = models.DateField(auto_now=False, null=True)
     address = models.TextField(max_length=500, null=True)
     phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.")
     phone_number = models.CharField(validators=[phone_regex], blank=True, max_length=20) # validators should be a list
  
  
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username',]
  
    objects = UserManager()
  
    class Meta:
     verbose_name = _('user')
     verbose_name_plural = _('users')
  
    def get_full_name(self):
      full_name = '%s %s' % (self.first_name, self.last_name)
      return full_name.strip()
  
   def get_short_name(self):
      return self.first_name
  
  def email_user(self, subject, message, from_email=None):
      send_mail(subject, message, from_email, [self.email]) 
  </code></pre></li>
  <li><p>Added it in settings.py as <code>AUTH_USER_MODEL = 'myauth.User'</code> and also registered it in admin.py. Migrations created all the tables with above mentioned columns.</p></li>
  <li><p>I wanted to modify registration to be able to register first_name and last_name along with username and email and password.Also to be able to login using email instead of username. So for that there could be clashing code in my user model and settings.py. For that in my serializers.py I added following code:</p>
  
  <pre><code> from myauth.models import User
  
   from allauth.account import app_settings as allauth_settings
   from allauth.utils import email_address_exists
   from allauth.account.adapter import get_adapter
   from allauth.account.utils import setup_user_email
  
   #Custom registration to store first and last name along with email and password 
   class RegisterSerializer(serializers.Serializer):
   email = serializers.EmailField(required=allauth_settings.EMAIL_REQUIRED)
   first_name = serializers.CharField(required=True, write_only=True)
   last_name = serializers.CharField(required=True, write_only=True)
   password1 = serializers.CharField(required=True, write_only=True)
   password2 = serializers.CharField(required=True, write_only=True)
  
   def validate_email(self, email):
       email = get_adapter().clean_email(email)
       if allauth_settings.UNIQUE_EMAIL:
         if email and email_address_exists(email):
          raise serializers.ValidationError(
              _("A user is already registered with this e-mail address."))
   return email
  
   def validate_password1(self, password):
     return get_adapter().clean_password(password)
  
   def validate(self, data):
     if data['password1'] != data['password2']:
      raise serializers.ValidationError(
          _("The two password fields didn't match."))
    return data
  
   def get_cleaned_data(self):
     return {
      'first_name': self.validated_data.get('first_name', ''),
      'last_name': self.validated_data.get('last_name', ''),
      'password1': self.validated_data.get('password1', ''),
      'email': self.validated_data.get('email', ''),
    }
  
   def save(self, request):
     adapter = get_adapter()
     user = adapter.new_user(request)
     self.cleaned_data = self.get_cleaned_data()
     adapter.save_user(request, user, self)
     setup_user_email(request, user, [])
     user.save()
     return user
  </code></pre></li>
  <li><p>My settings.py looks like following:</p>
  
  <pre><code>INSTALLED_APPS = (
   'django.contrib.admin',
   'django.contrib.auth',
   'django.contrib.contenttypes',
   'django.contrib.sessions',
   'django.contrib.messages',
   'django.contrib.staticfiles',
   'rest_framework',
   'rest_framework.authtoken',
   'rest_auth',
   'allauth',
   'allauth.account',
   'rest_auth.registration',
   'myauth',
   'swarms_app'
  )
  
  AUTH_USER_MODEL = 'myauth.User'
  
  MIDDLEWARE_CLASSES = (
   'django.contrib.sessions.middleware.SessionMiddleware',
   'django.middleware.common.CommonMiddleware',
   'django.middleware.csrf.CsrfViewMiddleware',
   'django.contrib.auth.middleware.AuthenticationMiddleware',
   'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
   'django.contrib.messages.middleware.MessageMiddleware',
   'django.middleware.clickjacking.XFrameOptionsMiddleware',
   'django.middleware.security.SecurityMiddleware',
   )
  
   ROOT_URLCONF = 'urls'
  
  TEMPLATES = [
  {
      'BACKEND': 'django.template.backends.django.DjangoTemplates',
      'DIRS': [],
      'APP_DIRS': True,
      'OPTIONS': {
          'context_processors': [
              'django.template.context_processors.debug',
              'django.template.context_processors.request',
              'django.contrib.auth.context_processors.auth',
              'django.contrib.messages.context_processors.messages',
          ],
        },
      },
     ]
  
     WSGI_APPLICATION = 'config.wsgi.application' 
  
  DATABASES = {
  'default': {
      'ENGINE': 'django.db.backends.mysql',  
      'NAME': 'new_swarms',
      'USER': 'root',
      'PASSWORD': 'root',
      'HOST': 'localhost',   # Or an IP Address that your DB is hosted on
      'PORT': '3306',
  }
  }
  
  
  STATIC_URL = '/static/'
  
  ##############################################################
  ## All the customization as taken from original swarms code ## 
  ##############################################################
  
  
  #This is added to use custon registration serializer which stores first and last name along with email and password
  REST_AUTH_REGISTER_SERIALIZERS = {
      'REGISTER_SERIALIZER': 'myauth.serializers.RegisterSerializer',
  } 
  
  REST_FRAMEWORK = {
  'DEFAULT_AUTHENTICATION_CLASSES': (
      'rest_framework.authentication.BasicAuthentication',
      'rest_framework.authentication.SessionAuthentication',
      'rest_framework.authentication.TokenAuthentication',
  )
  }
  
  #Following is added to enable registration with email instead of username
  AUTHENTICATION_BACKENDS = (
  # Needed to login by username in Django admin, regardless of `allauth`
  "django.contrib.auth.backends.ModelBackend",
  
  # `allauth` specific authentication methods, such as login by e-mail
  "allauth.account.auth_backends.AuthenticationBackend",
  )
  
  #This is required otherwise it asks for email server
  EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
  
  ACCOUNT_AUTHENTICATION_METHOD = 'email'
  ACCOUNT_EMAIL_REQUIRED = True   
  ACCOUNT_USERNAME_REQUIRED = False
  </code></pre></li>
  </ol>
  
  <p>Custom model I created seems to work, as on migration it created the table with all the mentioned fields. I even can see it in my admin interface. </p>
  
  <p><strong><em>What is going wrong here?</em></strong> </p>