pythondjangodjango-modelsdjango-authenticationdjango-users

What's the best way to extend the User model in Django?


What's the best way to extend the User model (bundled with Django's authentication app) with custom fields? I would also possibly like to use the email as the username (for authentication purposes).

I've already seen a few ways to do it, but can't decide on which one is the best.


Solution

  • The least painful and indeed Django-recommended way of doing this is through a OneToOneField(User) property.

    Extending the existing User model

    If you wish to store information related to User, you can use a one-to-one relationship to a model containing the fields for additional information. This one-to-one model is often called a profile model, as it might store non-auth related information about a site user.

    That said, extending django.contrib.auth.models.User and supplanting it also works...

    Substituting a custom User model

    Some kinds of projects may have authentication requirements for which Django’s built-in User model is not always appropriate. For instance, on some sites it makes more sense to use an email address as your identification token instead of a username.

    [Ed: Two warnings and a notification follow, mentioning that this is pretty drastic.]

    I would definitely stay away from changing the actual User class in your Django source tree and/or copying and altering the auth module.