I've done for customizing the User model, but I'm unable to log in to the admin panel with the superuser account I created. What could be causing this issue, and how can I resolve it? Any help or guidance would be greatly appreciated.
users/user.py
from django.contrib.auth.models import AbstractUser
from django.db import models
from ..managers.user import UserManager
class User(AbstractUser):
objects = UserManager()
manager/user.py
from django.contrib.auth.models import BaseUserManager
class UserManager(BaseUserManager):
def create_superuser(self, username, email=None, password=None, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
return self.create_user(username, email, password, **extra_fields)
def create_user(self, email, username=None, password=None, **extra_fields):
if not username:
raise ValueError('The username field must set')
email = self.normalize_email(email)
user = self.model(username=username, email=email, **extra_fields)
user.set_password(password)
user.save(using=self.db)
return user
user/serializer.py
from django.contrib.auth import get_user_model
from django.contrib.auth.password_validation import validate_password
from rest_framework import serializers # type: ignore # noqa: I201
User = get_user_model()
class UserReadSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username')
class UserWriteSerializer(serializers.ModelSerializer):
password = serializers.CharField(validators=[validate_password], write_only=True)
class Meta:
model = User
fields = ('password', 'username')
def create(self, validated_data):
password = validated_data.pop('password')
username = validated_data.get('username')
user = User.objects.create_user(username=username, password=password)
return user
settings/base.py
from typing import List
DEBUG = True # This should be 'False' in prod mode
SECRET_KEY = NotImplemented
ALLOWED_HOSTS: List[str] = ['*']
CORS_ALLOW_ALL_ORIGINS = True
CSRF_TRUSTED_ORIGINS: List[str] = []
INTERNAL_IPS = [
'127.0.0.1',
]
APPEND_SLASH = False
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# Third party
'corsheaders',
'rest_framework',
'rest_framework_simplejwt',
'django_filters',
'storages',
# App
'cores.authentication.apps.AuthenticationConfig',
'cores.users.apps.UsersConfig',
'cores.cards.apps.CardsConfig',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'cores.project.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',
],
},
},
]
ASGI_APPLICATION = 'cores.project.asgi.application'
WSGI_APPLICATION = 'cores.project.wsgi.application'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'trinion',
'USER': 'trinion',
'PASSWORD': 'trinion',
'HOST': 'localhost',
'PORT': '5432',
'ATOMIC_REQUESTS': True,
'CONN_MAX_AGE': 600,
}
}
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
AUTH_USER_MODEL = 'users.User'
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_TZ = True
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media' # type: ignore # noqa: F821
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'staticfiles' # type: ignore # noqa: F821
DATA_UPLOAD_MAX_MEMORY_SIZE = 10485760 # 10MB
FILE_UPLOAD_MAX_MEMORY_SIZE = 10485760 # 10MB
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
settings/rest_framework.py
from datetime import timedelta
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(days=365),
'REFRESH_TOKEN_LIFETIME': timedelta(days=30),
'UPDATE_LAST_LOGIN': True,
}
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': ('rest_framework_simplejwt.authentication.JWTAuthentication',),
'DEFAULT_FILTER_BACKENDS': [
'django_filters.rest_framework.DjangoFilterBackend',
'rest_framework.filters.OrderingFilter',
],
'DEFAULT_PARSER_CLASSES': ('rest_framework.parsers.JSONParser',),
'TEST_REQUEST_DEFAULT_FORMAT': 'json',
}
Environment Django 3.2 Python 3.9 PostgreSQL Docker (for development)
The issue can be here, have you tried login in with the email as the username
as per the code above, you're interchanging the fields username and email while calling the method self.create_user. soln: