7

I have a custom user model which is subclassed by AbstractUser with an added custom field.

# model.py
from django.db import models
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    ADM = 'admin'
    MEMBER = 'member'
    ROLE_CH = ((ADM, 'Administrator'), (MEMBER, 'Member'))

    role = models.CharField(max_length=20, choices=ROLE_CH, blank=True)

This model is also registered as the default auth model in settings.py

# settings.py
AUTH_USER_MODEL = "main.CustomUser"

Then in admin.py as per the documentation, I create a custom form which extends UserCreationForm and then register it to the custom user.

# admin.py
from django.contrib import admin
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.admin import UserAdmin
from .models import CustomUser

class CustomUserCreationForm(UserCreationForm):

    class Meta(UserCreationForm.Meta):
        model = CustomUser
        fields = UserCreationForm.Meta.fields + ('role',)

class CustomUserAdmin(UserAdmin):
    add_form = CustomUserCreationForm

admin.site.register(CustomUser, CustomUserAdmin)

However, it does not work as expected. The Add User form remains the default one i.e. only username, password and password confirmation fields are present. The role field does not appear.

Demetris
  • 2,981
  • 2
  • 25
  • 33

1 Answers1

8

Use form attribute instead of add_form:

class CustomUserAdmin(ModelAdmin):
    form = CustomUserCreationForm

admin.site.register(CustomUser, CustomUserAdmin)

UPD

First answer is correct only for ModelAdmin base class, since it doesn't have add_form attribute.

For UserAdmin you should update add_fieldsets attribute:

class CustomUserAdmin(UserAdmin):
    add_fieldsets = UserAdmin.add_fieldsets + (
        (None, {
            'fields': ('role',),
        }),
    )

admin.site.register(CustomUser, CustomUserAdmin)

In this case you dont even required add_form.

neverwalkaloner
  • 46,181
  • 7
  • 92
  • 100
  • Could you please expand on this? According to the documentation, `add_form` should be used for adding a user, and `form` was for editing the user. Also, I did try to change it but the form does not change. – Demetris May 29 '18 at 11:30
  • @Demetris sorry I missed you are using `UserAdmin`. Check updated answer. You need to set `add_fieldsets` also. – neverwalkaloner May 29 '18 at 11:52
  • `add_fieldsets` do not work for me, setting just `fieldsets` works. Did something change in between? – seb Jan 16 '19 at 23:17
  • 1
    @seb probably you are not using `UserAdmin`. add_fieldsets is only available for `UserAdmin` class. – neverwalkaloner Jan 18 '19 at 03:13