From the Django.Contrib.Auth docs:
Extending Django’s default User If you’re entirely happy with Django’s User model and you just want to add some additional profile information, you can simply subclass
django.contrib.auth.models.AbstractUser
and add your custom profile fields. This class provides the full implementation of the default User as an abstract model.
Said and done. I created a new model like below:
class MyUser(AbstractUser):
some_extra_data = models.CharField(max_length=100, blank=True)
This shows up in admin almost like Django's standard User
. However, the most important difference in admin is that the password-(re)set field is not present, but a normal CharField is displayed instead. Do I really have to override stuff in the admin-config to get this to work? If so, how can I do that in somewhat DRY way (i.e. without copying stuff from the Django source... eww...)?
A simpler solution, admin.py:
Django will correctly reference MyUser model for creation and modification. I'm using Django 1.6.2.
cesc's answer wasn't working for me when I attempted to add a custom field to the creation form. Perhaps it's changed since 1.6.2? Either way, I found adding the field to both fieldsets and add_fieldsets did the trick.
Another similar solution (Took from here):
nico's answer has been extremely helpful but I found Django still references the User model when creating a new user.
Ticket #19353 references this problem.
In order to fix it i had to make a few more additions to
admin.py
admin.py:
After digging around the Django source code for a while, I found a working soultion. I am not totally happy with this solution, but it seems to work. Feel free to suggest better solutions!
Django uses
UserAdmin
to render the nice admin look forUser
model. By just using this in ouradmin.py
-file, we can get the same look for our model.However, this alone is probably not a good solution, since Django Admin will not display any of your special fields. There are two reasons for this:
UserAdmin
usesUserChangeForm
as the form to be used when modifying the object, which in its turn usesUser
as its model.UserAdmin
defines aformsets
-property, later used byUserChangeForm
, which does not include your special fields.So, I created a special change-form which overloads the Meta inner-class so that the change form uses the correct model. I also had to overload
UserAdmin
to add my special fields to the fieldset, which is the part of this solution I dislike a bit, since it looks a bit ugly. Feel free to suggest improvements!