User is tightly interwoven with the Django internally, Django documentation highly recommends implementing a custom user model every time after created a new project.
One simple approach is to extend AbstractUser which keeps the default User fields and permissions. Another approach is to extend the AbstractBaseUser which requires more work.
4 steps for adding a custom user model:
- Create a
CustomUsermodel in a separated appaccounts. - Update
settings.py, add the app and specifyAUTH_USER_MODEL - Customize
UserCreationFormandUserChangeForm -
Register custom user model to admin.py
- Create a
CustomUsermodel in a separated appaccounts.
python manage.py startapp accounts
# accounts/models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
pass
- Update
settings.py, add the app and specifyAUTH_USER_MODEL
# settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'accounts.apps.AccountsConfig', # new
]
AUTH_USER_MODEL = 'accounts.CustomUser' # new
- Customize
UserCreationFormandUserChangeForm
# accounts/forms.py
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
class CustomUserCreationForm(UserCreationForm):
class Meta:
model = get_user_model()
fields = ('email', 'username', )
class CustomUserChangeForm(UserChangeForm):
class Meta:
model = get_user_model()
fields = ('email', 'username', )
- Register custom user model to admin.py
# accounts/admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth import get_user_model
from .forms import CustomUserChangeForm, CustomUserCreationForm
CustomUser = get_user_model()
class CustomUserAdmin(UserAdmin):
model = CustomUser
form = CustomUserChangeForm
add_form = CustomUserCreationForm
list_display = ['email', 'username', 'is_superuser', ]
admin.site.register(CustomUser, CustomUserAdmin)