Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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.

like image 568
Silfheed Avatar asked Jun 30 '09 00:06

Silfheed


People also ask

Can I add field in user model Django?

According to django documentation, you should create a custom user model whenver you start a django project. Because then you will have full control over the fields of the user objects in django, and you can add as many custom fields to the user model as you need and whenever you need.

How do I add a custom field to a user model?

All you have to do is add AUTH_USER_MODEL to settings with path to custom user class, which extends either AbstractBaseUser (more customizable version) or AbstractUser (more or less old User class you can extend).


1 Answers

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',)
like image 160
anschauung Avatar answered Sep 26 '22 08:09

anschauung