21

In a Django project, I have a custom user model that adds one extra field:

class User(AbstractUser):

    company = models.ForeignKey(Company, null=True, blank=True)

This model is defined in my app, say MyApp.models.

How can I get the new User model to show up under "Authentication and Authorization" as the original django.contrib.auth model?

enter image description here

gozzilli
  • 8,089
  • 11
  • 56
  • 87

6 Answers6

1
class User(AbstractUser):

    class Meta:
    app_label = 'auth'

This can solve your problem but may cause some errors when you migrate your app. The other hack is define get_app_list in your AdminSite.

Rin Nguyen
  • 405
  • 4
  • 11
1

I think what you're looking for is replacing the django user model. To do this, see the answer on this post: Extending the User model with custom fields in Django. I would suggest going the extending route, but that would mean both parent and child model would have to be registered.

If you really want one single model, just set the AUTH_USER_MODEL setting to your model. This essentially replaces the default model.

In your settings.py:

AUTH_USER_MODEL = "appname.UserModelName"

For more info on replacing the user model, see https://docs.djangoproject.com/en/dev/topics/auth/customizing/#substituting-a-custom-user-model.

Ian Kirkpatrick
  • 1,861
  • 14
  • 33
1

try this:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.utils.translation import gettext_lazy as _

class AdminExtra(UserAdmin):
    add_form_template = "admin/auth/user/add_form.html"
    change_user_password_template = None
    fieldsets = (
        (None, {"fields": ("username", "password")}),
        (_("Personal info"), {"fields": ("first_name", "last_name", "email", "nick_name")}),
        (
            _("Permissions"),
            {
                "fields": (
                    "is_active",
                    "is_staff",
                    "is_superuser",
                    "groups",
                    "user_permissions",
                ),
            },
        ),
        (_("Important dates"), {"fields": ("last_login", "date_joined")}),
    )
    add_fieldsets = (
        (
            None,
            {
                "classes": ("wide",),
                "fields": ("username", "password1", "password2"),
            },
        ),
    )


admin.site.register(User, AdminExtra)
0

In admin.py use

from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User

UserAdmin.list_display = ('email', 'first_name', 'last_name', 'is_active', 'date_joined', 'is_staff')

admin.site.register(User, UserAdmin)
SuReSh
  • 1,503
  • 1
  • 22
  • 47
  • That is what I'm doing, but a) if I use *my* `User` class, it appears in my app; b) if I use Django auth's class, it doesn't appear anywhere (not surprising since that's not the class I'm using to represent the user). – gozzilli Mar 17 '16 at 14:26
  • I have a superuser, yes. – gozzilli Mar 18 '16 at 17:18
0

Might want to try this:

https://libraries.io/pypi/django-modeladmin-reorder

Custom ordering for the apps and models in the admin app. You can also rename, cross link or exclude models from the app list.

dsomnus
  • 1,391
  • 14
  • 21
0

How can I get the new User model to show up under "Authentication and Authorization"

I had the same concern using Django 3.0, this is how I solved it :

class CustomUser(AbstractUser):
    
     class Meta:
         db_table = 'auth_user'
         app_label = 'auth'

In settings :

AUTH_USER_MODEL = "auth.CustomUser"
elsadek
  • 1,028
  • 12
  • 39