I am at the point of desperation, and have looked at countless tutorials, stackoverflow posts, and can’t seem to resolve this issue. I want to create a custom User Model, but when I try to sign one up, i get hit with the Manager isn't available; 'auth.User' has been swapped for 'account.User'
error. I have indeed specified the AUTH_USER_MODEL
in settings.py. I believe I need to implement a User Manager, but I am apparently out of my depth with it.
My full traceback:
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/
Django Version: 4.2.4
Python Version: 3.11.4
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'account',
'audition']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback (most recent call last):
File "C:\Users\benmc\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\core\handlers\exception.py", line 55, in inner
response = get_response(request)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\benmc\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\benmc\source\Django\Enterlinked\.venv\account\views.py", line 18, in sign_up_view
if form.is_valid():
^^^^^^^^^^^^^^^
File "C:\Users\benmc\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\forms\forms.py", line 201, in is_valid
return self.is_bound and not self.errors
^^^^^^^^^^^
File "C:\Users\benmc\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\forms\forms.py", line 196, in errors
self.full_clean()
^^^^^^^^^^^^^^^^^
File "C:\Users\benmc\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\forms\forms.py", line 433, in full_clean
self._clean_fields()
^^^^^^^^^^^^^^^^^^^^
File "C:\Users\benmc\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\forms\forms.py", line 448, in _clean_fields
value = getattr(self, "clean_%s" % name)()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\benmc\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\contrib\auth\forms.py", line 155, in clean_username
and self._meta.model.objects.filter(username__iexact=username).exists()
^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\benmc\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\db\models\manager.py", line 196, in __get__
raise AttributeError(
^
Exception Type: AttributeError at /
Exception Value: Manager isn't available; 'auth.User' has been swapped for 'account.User'
My forms.py that causes the traceback:
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import get_user_model
User = get_user_model()
class UserSignUpForm(UserCreationForm):
User = get_user_model()
fields = ("username", "password")
widgets = {"password":forms.HiddenInput}
My views.py function:
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse
from django.contrib.auth.forms import UserCreationForm
from .forms import UserSignUpForm
from django.urls import reverse_lazy
from django.views import generic
from . models import User, Talent, Company, Representative, Casting
import audition.models
from django.contrib.auth import get_user_model
User = get_user_model()
def sign_up_view(request):
form = UserSignUpForm()
if request.method=="POST":
form=UserSignUpForm(request.POST)
if form.is_valid():
form.save()
context = {"form":form}
return render(request, "../templates/registration/signup.html", context)
My models.py:
from typing import Any
from django.db import models
from django.db.models.query import QuerySet
from django.utils.translation import gettext_lazy
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, UserManager
from django.contrib.auth.base_user import BaseUserManager
from datetime import datetime
import audition.models
class CustomUserManager(UserManager):
def _create_user(self, email, password, **extra_fields):
if not email:
raise ValueError("Please provide a valid e-mail address")
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self, email=None, password=None, **extra_fields):
extra_fields.setdefault('is_staff', False)
extra_fields.setdefault('is_superuser', False)
return self._create_user(email, password, **extra_fields)
def create_superuser(self, email=None, password=None, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
return self._create_user(email, password, **extra_fields)
"""class Address(models.Model):
street = models.CharField("Street", max_length=1024)
city = models.CharField("City", max_length=1024)
province = models.CharField("Province", max_length=1024)
code = models.CharField("Zip", max_length=10)
def get_address(self):
return f"{self.street} {self.city}, {self._state} {self.code}
"
"""
class User(AbstractBaseUser, PermissionsMixin):
objects = CustomUserManager()
email = models.EmailField(blank=True, default="", unique=True)
class Role(models.TextChoices):
TALENT = "TALENT", "Talent"
REPRESENTATIVE = "REP", "Representative"
CASTING = "CASTING", "Casting"
PRODUCTION = "PROD", "Production"
ADMIN = "ADMIN", "Admin"
base_role = Role.ADMIN
role = models.CharField(max_length=10, choices=Role.choices, default=base_role)
first_name = models.CharField(max_length=255, blank=True, default='')
USERNAME_FIELD = "email"
EMAIL_FIELD = "email"
REQUIRED_FIELDS = []
"""
country_code = models.CharField(max_length=4)
area_code = models.CharField(max_length=4)
phone_number = models.CharField(max_length=10)
mailing_address = Address()"""
date_of_birth = models.DateField(null=True, blank=True)
def age(self):
x= int((datetime.now().date() - self.date_of_birth).days / 365.25)
y= datetime.now().date()
z = self.date_of_birth
a = (datetime.now().date() - self.date_of_birth).days
return int((datetime.now().date() - self.date_of_birth).days / 365.25)
def __str__(self) -> str:
if self.first_name == None:
return self.username
return f"{self.first_name} {self.last_name}"
def save(self, *args, **kwargs):
if not self.pk:
self.role=self.base_role
return super().save(*args, **kwargs)
class Meta:
verbose_name="User"
verbose_name_plural = "Users"
If someone please has any idea of what could be the issue, or how I may resolve it please let me know. This has been a few days now and I am beginning to lose hope.