Not all fields are showing correctly in django admin

I've added a plan field to my custom Account class, but cannot get it to show on the individual account page in the django admin. It shows correctly in table of all accounts in the list view (as denoted by list_display), but does not show on each individual account page.

Here's my Account model:

class Account(AbstractUser):
    PLANS = (
        ("free", "free"),
        ("pro", "pro")
    )

    plan = models.CharField(max_length=10, choices=PLANS, default="free")

    def __str__(self) -> str:
        return self.first_name

And my admin file:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from accounts.models import Account
from subscribers.models import Subscriber


class SubscriberInline(admin.TabularInline):
    model = Subscriber
    extra = 0


class AccountAdmin(UserAdmin):
    inlines = [SubscriberInline, ]
    list_display = ("first_name", "plan", "email")
    # fields = ("first_name", "plan", "email")


admin.site.register(Account, AccountAdmin)

Why does this happen?

Is the problem related to the custom Account class which inherits from the AbstractUser model? I thought to add fields to the AccountAdmin class, but that just returns the below error:

ERRORS:
<class 'accounts.admin.AccountAdmin'>: (admin.E005) Both 'fieldsets' and 'fields' are specified.

The plan field also doesn't show in the admin panel when trying to create a new account (mind you, neither do most of the other fields as it only asks for the username, password1 and password2 fields, and the option to add new subscribers to the table, but other fields like first_name etc can be edited in the admin after creation).

Thanks

UPDATE: Adding user @bdbd's suggested changes seems to not make a difference to the admin area - am I adding this incorrectly? Here's my admin.py after adding @bdbd's changes:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from accounts.models import Account
from subscribers.models import Subscriber

from django.contrib.auth.forms import UserChangeForm
from django import forms

PLANS = (
        ("free", "free"),
        ("pro", "pro")
)


class MyAccountChangeForm(UserChangeForm):
    plan = forms.ChoiceField(choices=PLANS)


class SubscriberInline(admin.TabularInline):
    model = Subscriber
    extra = 0


class AccountAdmin(UserAdmin):
    form = MyAccountChangeForm
    inlines = [SubscriberInline, ]
    list_display = ("first_name", "plan", "email")

    # @todo: bug! plan field not showing in django admin on individual account pages


admin.site.register(Account, AccountAdmin)

UPDATE 2: Screenshots of admin area:

account list page correctly showing plan column

no plan on individual account page 1

no plan on individual account page 2

no plan on individual account page 3

no plan on individual account page 4


Solution 1:

You should not extend from UserAdmin. Instead, you should create your own model admin class which extends from admin.ModelAdmin.

Then you should register your model separately.

class AccountAdmin(admin.ModelAdmin):
    ...

admin.site.register(Account, AccountAdmin)

As necessary, you can customize AccountAdmin to get the effect you want. You can peek at the UserAdmin source code to see how it is customized, if you want your admin view to behave similarly.

Solution 2:

You need to override the default form that is being used by UserAdmin and add your field like so:

from django.contrib.auth.forms import UserChangeForm
from django import forms


class MyAccountChangeForm(UserChangeForm):
    plan = forms.ChoiceField(choices=PLANS)

Then assign the form to your admin:

class AccountAdmin(UserAdmin):
    form = MyAccountChangeForm