Pritam
Pritam

Reputation: 333

Extending default user using Abstract User

I am trying to add some extra fields in default user model. But the new fields is not showing up in admin page. Here are the models of 'users' app.

models.py

from django.db import models

from django.contrib.auth.models import AbstractUser


class CustomUser(AbstractUser):
    q1 = models.TextField()
    q2 = models.TextField()

forms.py

from django import forms

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

from .models import CustomUser


class CustomUserCreation(UserCreationForm):
    class Meta(UserCreationForm.Meta):
        model = CustomUser
        fields = ('username', 'email', 'q1', 'q2')


class CustomUserChange(UserChangeForm):  
    class Meta:
        model = CustomUser
        fields = ('username', 'email', 'q1', 'q2')

admin.py

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

from .forms import CustomUserCreation, CustomUserChange
from .models import CustomUser


class CustomUserAdmin(UserAdmin):
    add_form = CustomUserCreation
    form = CustomUserChange
    list_display = ['email', 'username', 'password', 'q1', 'q2']
    model = CustomUser

admin.site.register(CustomUser, CustomUserAdmin)

P.S. I have added AUTH_USER_MODEL = users.CustomUser in settings.py

Upvotes: 1

Views: 834

Answers (3)

saum
saum

Reputation: 343

You can just create a user profile model with a OneToOne relation and fire it up using signal whenever a user has been added without having to touch the User model.

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User

class Profile(models.Model):
    user=models.OneToOneField(User, on_delete=models.CASCADE)
    q1 = models.TextField()
    q2 = models.TextField()
   
    def __unicode__(self):
        return self.user.q1


def create_profile(sender, **kwargs):
    user = kwargs["instance"]
    if kwargs["created"]:
        user_profile = Profile(user=user)
        user_profile.save()
post_save.connect(create_profile, sender=User)

Upvotes: 0

Sanip
Sanip

Reputation: 1810

In your admin.py file you need to override UserAdmin as:

class CustomUserAdmin(BaseUserAdmin):
    form = CustomUserChange
    add_form = CustomUserCreation

    list_display = ('email', 'username', 'password', 'q1', 'q2')
    fields = ('email', 'username', 'password', 'q1', 'q2')
    model = CustomUser

admin.site.register(CustomUser, UserAdmin)

Check this example in the docs for more understanding link

Upvotes: 1

Devang Padhiyar
Devang Padhiyar

Reputation: 3707

Please check the following things into your django project.

  • Have you added AUTH_USER_MODEL = 'users.models.CustomUser' to your settings.py file ?
  • Ensure you have added q1 and q2 to your fields attribute in CustomUserAdmin as follow:

    class CustomUserAdmin(UserAdmin):
        add_form = CustomUserCreation
        form = CustomUserChange
        list_display = ['email', 'username', 'password', 'q1', 'q2']
        fields = ['email', 'username', 'password', 'q1', 'q2']
        model = CustomUser
    

Upvotes: 0

Related Questions