Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding extra field in admin for custom user in Django 1.11

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.

like image 623
Demetris Avatar asked May 29 '18 11:05

Demetris


1 Answers

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.

like image 200
neverwalkaloner Avatar answered Sep 27 '22 22:09

neverwalkaloner