For the django admin, how do I add a field to the User model and have it editable in the admin?

django, django-admin

Solution

First the "is it plugged in?" question -- Have you manually added new_field to the users table in the database? Syncdb wouldn't have taken care of that, of course.

After that, I would try appending the fields onto the existing UserAdmin rather than rebuilding it from scratch:

from django.contrib.auth.admin import UserAdmin

UserAdmin.list_display += ('new_field',)  # don't forget the commas
UserAdmin.list_filter += ('new_field',)
UserAdmin.fieldsets += ('new_field',)

Problem

I'm trying to understand the django admin better and at the same time, I'm trying to add one more field to the current user admin. In models.py I've done ``` User.add_to_class('new_field', models.BooleanField(default=False)) ``` and in admin.py I've got the following (with fieldsets basically just copied from django/contrib/auth/admin.py) ``` class AdjUserAdmin(UserAdmin): list_display = UserAdmin.list_display + ('new_field',) list_filter = UserAdmin.list_filter + ('new_field',) fieldsets = UserAdmin.fieldsets fieldsets[1][1]['fields'] = ('first_name','last_name','email','new_field') ``` The problem is, when I do this I get the error: `AdjUserAdmin.fieldsets[4][1]['fields']' refers to field 'new_field' that is missing from the form.` I've looked at UserChangeForm, but it looks like it's already correctly pulling in User as the model. I'm not sure as to why `new_field` is missing from the form. Thanks In regards to this being smelly code I know this is a smelly monkey patching way to go about doing this, but subclassing gives me issues mainly for these reasons.. if I could get it to work the way stated above, I'd be happy.. and maybe smelly. In regards to the recommended way I'm aware of the recommended way of creating a user profile, just that in particular situations, I don't see the merit in creating an entire new table and having an additional call to the database when all I want to store is an extra bit of information such as `is_private` or some such. If I'm storing lots more info, then I agree, setting up a user profile is preferable.

Original source