sasha
sasha

Reputation: 155

How to override change model object form?

I am trying to override change model form for adming page but don't know why it doesn't work. Can smb help me please?

My forms.py:

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



class CustomUserChangeForm(UserChangeForm):
    email = forms.EmailField(required=True, label="Email")
    phone = forms.CharField(label="Phone number")

    class Meta:
        model = User
        fields = ("username", "email", "phone", )

My admin.py:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .forms import CustomUserCreationForm, CustomUserChangeForm
from .models import CustomUser


class CustomUserAdmin(UserAdmin):
   add_form = CustomUserCreationForm
   form = CustomUserChangeForm
   model = CustomUser
   list_display = ['email', 'username', 'phone', ]

admin.site.register(CustomUser, CustomUserAdmin)

My models.py

class CustomUser(AbstractBaseUser, PermissionsMixin):
    username = models.CharField(_('username'), max_length=30, 
    unique=True)
    first_name = models.CharField(_('first name'), max_length=30, 
    blank=True)
    last_name = models.CharField(_('last name'), max_length=30, 
    blank=True)
    email = models.EmailField(_('email address'), unique=True, 
    blank=True, null=True)
    phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$',
                             message="Phone number must be entered in the 
    format: '+999999999'. Up to 15 digits allowed.")
    phone = models.CharField(_('phone number'), validators=[phone_regex], 
    max_length=17,
                         unique=True, blank=True, null=True)

I am trying to override change model form but don't know why it doesn't work. Can smb help me please?

Upvotes: 1

Views: 101

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 476503

At first sight you used the wrong model in your form: it should be:

from myapp.models import CustomUser
from django.contrib.auth.forms import UserChangeForm

class CustomUserChangeForm(UserChangeForm):
    email = forms.EmailField(required=True, label='Email')
    phone = forms.CharField(label='Phone number')

    class Meta:
        model = CustomUser
        fields = ('username', 'email', 'phone', )

That being said, since your CustomerUserChangeForm does not have any fields to change passwords or permissions, you can use a simple ModelForm [Django-doc]:

from django.forms import ModelForm
from myapp.models import CustomUser

class CustomUserChangeForm(ModelForm):
    email = forms.EmailField(required=True, label='Email')
    phone = forms.CharField(label='Phone number')

    class Meta:
        model = CustomUser
        fields = ('username', 'email', 'phone', )

Upvotes: 1

Related Questions