0

I am new to Django and I am trying to implement custom user authentication for my website. When I try to create a new user for the signup view, I get the error 'Manager isn't available; 'auth.User' has been swapped for 'users.CustomUser'. Creation of new users from Admin page works fine.

I googled the error, but none of the advised solution is working for me.

See the code below. The django app I created to manage users is "users".

models.py:

from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    birth_date = models.DateField(null=True, blank=True)
forms.py:

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

class CustomUserCreationForm(UserCreationForm):

    first_name = forms.CharField(max_length=30, help_text='Required`.')
    last_name = forms.CharField(max_length=30, help_text='Required.')
    email = forms.EmailField(max_length=254, help_text='Required. Please input a valid email address.')
    birth_date = forms.DateField()

    class meta(UserCreationForm.Meta):
        model = CustomUser
        fields = UserCreationForm.Meta.fields + ('first_name', 'last_name', 'email', 'birth_date',)

class CustomUserChangeForm(UserChangeForm):

    class Meta:
        model = CustomUser
        fields = UserChangeForm.Meta.fields

views.py:

from .forms import CustomUserCreationForm

from django.urls import reverse_lazy
from django.views.generic import CreateView

class SignUpView(CreateView):
    form_class = CustomUserCreationForm
    success_url = reverse_lazy('login')
    template_name = 'signup.html'
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 = ['username', 'email', 'first_name', 'last_name', 'is_staff',]

admin.site.register(CustomUser, CustomUserAdmin)
settings.py:

INSTALLED_APPS = [
    # Local
    'users.apps.UsersConfig',
    'pages.apps.PagesConfig',
    'casualties.apps.CasualtiesConfig',

    # 3rd Party
    'import_export',
    'django_tables2',
    'django_filters',
    'bootstrap4',

    # Django
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

...

AUTH_USER_MODEL = 'users.CustomUser'

Thanks in advance for your help!!!

  • This looks like a duplicate -- have you seen https://stackoverflow.com/questions/17873855/manager-isnt-available-user-has-been-swapped-for-pet-person? – rustyshackleford Mar 15 '20 at 21:31
  • Does this answer your question? [Manager isn't available; User has been swapped for 'pet.Person'](https://stackoverflow.com/questions/17873855/manager-isnt-available-user-has-been-swapped-for-pet-person) – markwalker_ Mar 15 '20 at 21:38
  • Hi there, I tried both last week, they didn't solve the problem – Flavio Graser Mar 17 '20 at 13:22
  • @FlavioGraser, this is common problem. you r missing something. Please share your error as details here. – Saiful Azad Mar 21 '20 at 14:06

1 Answers1

0

Sorted out, after some more tries. This is the working code:

models.py:

from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    pass

    birth_date = models.DateField(null=True, blank=True)

    def __str__(self):
        return self.username
forms.py:

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

class CustomUserCreationForm(UserCreationForm):

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

class CustomUserChangeForm(UserChangeForm):

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

    def __init__(self, *args, **kwargs):
       super(CustomUserChangeForm, self).__init__(*args, **kwargs)
       del self.fields['password']