Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Custom User model fields (AbstractUser) not showing in django admin

Tags:

I have extended User model for django, using AbstractUser method. The problem is, my custom fields do not show in django admin panel.

My models.py:

from django.contrib.auth.models import AbstractUser   class User(AbstractUser):     is_bot_flag = models.BooleanField(default=False) 

My admin.py:

from django.contrib.auth.admin import UserAdmin from .models import User  admin.site.register(User, UserAdmin) 

Thanks

like image 454
SadFrodo Avatar asked Dec 28 '17 16:12

SadFrodo


2 Answers

If all you want to do is add new fields to the standard edit form (not creation), there's a simpler solution than the one presented above.

from django.contrib import admin from django.contrib.auth.admin import UserAdmin  from .models import User   class CustomUserAdmin(UserAdmin):     fieldsets = (         *UserAdmin.fieldsets,  # original form fieldsets, expanded         (                      # new fieldset added on to the bottom             'Custom Field Heading',  # group heading of your choice; set to None for a blank space instead of a header             {                 'fields': (                     'is_bot_flag',                 ),             },         ),     )   admin.site.register(User, CustomUserAdmin) 

This takes the base fieldsets, expands them, and adds the new one to the bottom of the form. You can also use the new CustomUserAdmin class to alter other properties of the model admin, like list_display, list_filter, or filter_horizontal. The same expand-append method applies.

like image 98
Zoetrophy Avatar answered Oct 10 '22 03:10

Zoetrophy


You have to override UserAdmin as well, if you want to see your custom fields. There is an example here in the documentation.

You have to create the form for creating (and also changing) user data and override UserAdmin. Form for creating user would be:

class UserCreationForm(forms.ModelForm):     password1 = forms.CharField(label='Password', widget=forms.PasswordInput)     password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)      class Meta:         model = User         fields = '__all__'      def clean_password2(self):         password1 = self.cleaned_data.get("password1")         password2 = self.cleaned_data.get("password2")         if password1 and password2 and password1 != password2:             raise forms.ValidationError("Passwords don't match")         return password2      def save(self, commit=True):         user = super().save(commit=False)         user.set_password(self.cleaned_data["password1"])         if commit:             user.save()         return user 

You override UserAdmin with:

from django.contrib.auth.admin import UserAdmin as BaseUserAdmin  class UserAdmin(BaseUserAdmin):     add_form = UserCreationForm     add_fieldsets = (         (None, {             'classes': ('wide',),             'fields': ('email', 'first_name', 'last_name', 'is_bot_flag', 'password1', 'password2')}         ),     ) 

and then you register:

admin.site.register(User, UserAdmin) 

I pretty much copy/pasted this from documentation and deleted some code to make it shorter. Go to the documentation to see the full example, including example code for changing user data.

like image 41
Borut Avatar answered Oct 10 '22 05:10

Borut