Custom user model for Django with the same behaviour as the default User class but without a username field. Uses email as the USERNAME_FIELD for authentication.
- Install django-custom-user with your favorite Python package manager:
pip install django-custom-user
- Add
'custom_user'
to yourINSTALLED_APPS
setting:
INSTALLED_APPS = (
# other apps
'custom_user',
)
- Set your
AUTH_USER_MODEL
setting to useEmailUser
:
AUTH_USER_MODEL = 'custom_user.EmailUser'
- Create the database tables:
python manage.py migrate
Instead of referring to EmailUser
directly, you should reference the user model using get_user_model()
as explained in the Django documentation. For example:
from django.contrib.auth import get_user_model
user = get_user_model().objects.get(email="[email protected]")
When you define a foreign key or many-to-many relations to the EmailUser
model, you should specify the custom model using the AUTH_USER_MODEL
setting. For example:
from django.conf import settings
from django.db import models
class Article(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL)
You can easily extend EmailUser
by inheriting from AbstractEmailUser
. For example:
from custom_user.models import AbstractEmailUser
class MyCustomEmailUser(AbstractEmailUser):
"""
Example of an EmailUser with a new field date_of_birth
"""
date_of_birth = models.DateField()
Remember to change the AUTH_USER_MODEL
setting to your new class:
AUTH_USER_MODEL = 'my_app.MyCustomEmailUser'
If you use the AdminSite, add the following code to your my_app/admin.py
file:
from django.contrib import admin
from custom_user.admin import EmailUserAdmin
from .models import MyCustomEmailUser
class MyCustomEmailUserAdmin(EmailUserAdmin):
"""
You can customize the interface of your model here.
"""
pass
# Register your models here.
admin.site.register(MyCustomEmailUser, MyCustomEmailUserAdmin)
Django:
- 4.1
- 4.0
- 3.2 LTS
Python:
- 3.11
- 3.10
- 3.9
- 3.8
- 3.7
Added support for Django 4.1 and Python 3.11.
After a long hiatus, this new version brings compatibility with the latest Django and Python versions, among lots of small improvements and cleanups.
- Supported versions:
- Django: 3.2 LTS, 4.0
- Python: 3.7, 3.8, 3.9, 3.10
- Import latest code changes from Django 4.0 (#65):
EmailUserCreationForm
does not strip whitespaces in the password fields, to match Django's behavior.EmailUserCreationForm
supports custom password validators configured byAUTH_PASSWORD_VALIDATORS
.EmailUser.objects.create_superuser()
allows empty passwords. It will also check that bothis_staff
andis_superuser
parameters areTrue
(if passed). Otherwise, it would create an invalid superuser.
- Internal changes:
Note that older versions of Django are not supported, but you can use the previous version 0.7 if you need it.
- Fixed change password link in EmailUserChangeForm (thanks to Igor Gai and rubengrill)
- Added migrations (thanks to everybody for the help).
How to apply the migrations after upgrading:
For this version just run the following commands.
python manage.py migrate custom_user 0001_initial_django17 --fake python manage.py migrate custom_user
This version didn't work without migrations, which means that your migrations will conflict with the new ones included in this version.
If you added the migrations with Django's MIGRATION_MODULES setting, delete the folder containing the migration modules and remove the setting from your config.
If you just ran python manage.py makemigrations
, the migrations are located inside your system's or virtualenv's site-packages
folder. You can check the location running this command, and then delete the folder migrations
that is inside:
python -c "import os; import custom_user; print(os.path.dirname(custom_user.__file__))"
You can check if you have removed the migrations successfully running this command, you shouldn't see the section custom_user
anymore:
python manage.py migrate --list
Once the old migrations are gone, run the following command to finish:
python manage.py migrate custom_user 0002_initial_django18 --fake
- Django 1.7 compatible (thanks to j0hnsmith).
- Custom application verbose_name in AdminSite with AppConfig.
- The create_user() and create_superuser() manager methods now accept is_active and is_staff as parameters (thanks to Edil Kratskih).
- AdminSite now works when subclassing AbstractEmailUser (thanks to Ivan Virabyan).
- Updated model changes from Django 1.6.1.
- Django 1.6 compatible (thanks to Simon Luijk).
- Initial release.