Package: django-username-email
CUser makes it easy to use email address as your identification token
instead of a username.CUser is a custom Django user model (extendsAbstractBaseUser) so it
takes a tiny amount of effort to use.The only difference between CUser and the vanilla DjangoUseris email
address is theUSERNAME_FIELD(and username does not exist).CUser supports Django 3.2 - 4.2. If you need to use CUser with
Django 1.8 - 3.1, you must install an older, unmaintained version of
CUser, as noted in the “Install & Set up” section.Why use CUser?Because you want everything indjango.contrib.authexcept for theusernamefield and you also want users tolog in with email addresses.
And you don’t want to create your own custom user model or authentication
backend.Install & Set upImportant:To keep things simple, the steps below will guide you through
the process of using CUser’sCUsermodel for your Django project’s user
model. However, it is strongly recommended that you set up a custom user model
that extends CUser’sAbstractCUserclass, even if CUser’sCUsermodel
is sufficient for you (this way, you can customize the user model if the need
arises). If you wouldnotlike to follow this recommendation and just want to
use CUser’sCUsermodel, simply follow the steps below (you can skip the
rest of this paragraph). If youwouldlike to follow this recommendation, you
should still follow the steps below, but with the following adjustments: After
step 3, followthese instructions,
but instead of usingfrom django.contrib.auth.models import AbstractUserusefrom cuser.models import AbstractCUserand instead of usingfrom django.contrib.auth.admin import UserAdminusefrom cuser.admin import UserAdmin. Then for step 4 of the steps below, you
should setAUTH_USER_MODELto your custom user model instead of CUser’sCUsermodel. You should then runpython manage.py makemigrations. After
that, you may follow the remaining steps below just the way they are.If your Django project previously used Django’s default user model,django.contrib.auth.models.User, or if you are unfamiliar with using
custom user models, jump toNotesfirst (then come
back). Otherwise, continue onward!Install withpip:# Django 3.2 - 4.2pipinstalldjango-username-email# Django 3.1 (unmaintained)pipinstalldjango-username-email==2.4.2# Django 2.2 or 3.0 (unmaintained)pipinstalldjango-username-email==2.3.1# Django 2.0 or 2.1 (unmaintained)pipinstalldjango-username-email==2.2.4# Django 1.11 (unmaintained)pipinstalldjango-username-email==2.1.6# Django 1.8 - 1.10 (unmaintained)pipinstalldjango-username-email==2.1.2Addcuserto yourINSTALLED_APPSsetting:INSTALLED_APPS=[...'cuser',]Specify the custom model as the default user model for your project
using theAUTH_USER_MODELsetting in your settings.py:AUTH_USER_MODEL='cuser.CUser'If you use Django’s defaultAuthenticationFormclass, it is
strongly recommended that you replace it with the one included with
CUser. This will make the<input>have itstypeattribute set
toemailand browsers’ autocomplete feature will suggest email
addresses instead of usernames. For example, if your project is using
Django’s defaultLoginViewview (orloginview in Django < 1.11), this is
what you would put in your urls.py in order to make use of CUser’sAuthenticationFormclass:fromcuser.formsimportAuthenticationFormfromdjango.conf.urlsimportinclude,urlfromdjango.contrib.auth.viewsimportLoginViewurlpatterns=[url(r'^accounts/login/$',LoginView.as_view(authentication_form=AuthenticationForm),name='login'),url(r'^accounts/',include('django.contrib.auth.urls')),...]Or if you’re using Django < 1.11:fromcuser.formsimportAuthenticationFormfromdjango.conf.urlsimportinclude,urlfromdjango.contrib.auth.viewsimportloginurlpatterns=[url(r'^accounts/login/$',login,{'authentication_form':AuthenticationForm},name='login'),url(r'^accounts/',include('django.contrib.auth.urls')),...]Run migrations.pythonmanage.pymigrateThere is a good chance that you wantfoo@example.comandFOO@example.comto
be treated as the same email address. There is a variety of ways to go about
doing this. How you handle it will depend on the needs of your project and
personal preference, so CUser does not provide a solution for this out of
the box. You will need to address this yourself if this applies to you. If
you’re using CUser’sAuthenticationFormclass (see step 5), you may want
to subclass it and overrideerror_messages['invalid_login'].ConfigurationTo override any of the default settings, create a dictionary namedCUSERin
your settings.py with each setting you want to override. For example:CUSER={'app_verbose_name':'Authentication and Authorization','register_proxy_auth_group_model':True,}These are the settings:app_verbose_name(default:_("CustomUser"))This controls the value that CUser will use for itsAppConfigclass’verbose_name.register_proxy_auth_group_model(default:False)When set toTrue, CUser’s admin.py will unregister Django’s defaultGroupmodel and register its own proxy model of Django’s defaultGroupmodel (also namedGroup). This is useful if you want Django’s defaultGroupmodel to appear in the same part of the admin as CUser’sCUsermodel.NotesIf you have tables referencing Django’sUsermodel, you will have to
delete those table and migrations, then re-migrate. This will ensure
everything is set up correctly from the beginning.Instead of referring to User directly, you should reference the user model
usingdjango.contrib.auth.get_user_model()When you define a foreign key or many-to-many relations to theUsermodel, you should specify the custom model using theAUTH_USER_MODELsetting.For example:fromdjango.confimportsettingsfromdjango.dbimportmodelsclassProfile(models.Model):user=models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,)LicenseReleased under the MIT license. See LICENSE for details.Original authorTom MeagherQuestions, comments, or anything else?Open an issue