[Django]-Manager isn't available; User has been swapped for 'pet.Person'

218đź‘Ť

âś…

The problem is that User refers to django.contrib.auth.models.User and now you have got a Custom User pet.Person assuming you have in the settings.py

AUTH_USER_MODEL = "pet.Person"

you have to define User with the Custom User model and you can do this with get_user_model at the top of the file where you use User

from django.contrib.auth import get_user_model
User = get_user_model()

now you will be able to use Custom User model and the problem has been fixed.

15đź‘Ť

For anyone else who might come across this problem, I also solved it by simply doing this on forms.py:

add this at the top of the forms.py file

from .models import YourCustomUser

and then add this to your forms.py CustomUser form:

class SignUpForm(UserCreationForm):
#profile_year        = blaaa blaa blaaa irrelevant.. You have your own stuff here don't worry about it

   # here is the important part.. add a class Meta-
   class Meta:
      model = YourCustomUser #this is the "YourCustomUser" that you imported at the top of the file  
      fields = ('username', 'password1', 'password2', #etc etc, other fields you want displayed on the form)

BIG NOTES, ATTENTION:

  1. This code worked for my case. I have a view for signing users up, I had a problem here and I solved it, I haven’t tried it for logging in users.

  2. The include = () part is required, or you can add exclude = (), but you have to have one

14đź‘Ť

Important caveat to update the above solutions…
If you’re facing this kind of problem, you’ve probably tried various solutions around the web telling you to add AUTH_USER_MODEL = users.CustomUser to settings.py and then to add the following code to views.py forms.py and any other file that calls User:

from django.contrib.auth import get_user_model
User = get_user_model()

And then you scratch your head when you get the error:

Manager isn't available; 'auth.User' has been swapped for 'users.User'

Anytime your code references User such as:

User.objects.get()

Cause you know you already put objects = UserManager() in your custom user class (UserManager being the name of your custom manager that extends BaseUserManager).

Well as it turns out doing:

User = get_user_model() # somewhere at the top of your .py file
# followed by
User.objects.get() # in a function/method of that same file

Is NOT equivalent to:

get_user_model().objects.get() # without the need for User = get_user_model() anywhere

Perhaps not intuitive, but it turns out that that in python, executing User = get_user_model() once at the time of import does not then result in User being defined across subsequent calls (i.e. it does not turn User into a “constant” of sorts which you might expect if you’re coming from a C/C++ background; meaning that the execution of User = get_user_model() occurs at the time of imports, but is then de-referenced before subsequent called to class or function/method in that file).

So to sum up, in all files that reference the User class (e.g. calling functions or variables such as User.objects.get() User.objects.all() User.DoesNotExist etc…):

# Add the following import line
from django.contrib.auth import get_user_model

# Replace all references to User with get_user_model() such as...
user = get_user_model().objects.get(pk=uid)
# instead of  user = User.objects.get(pk=uid)
# or
queryset = get_user_model().objects.all()
# instead of queryset = User.objects.all()
# etc...

Hope this helps save others some time…

8đź‘Ť

In forms.py

# change
from django.contrib.auth.models import User

# to
from django.contrib.auth import get_user_model

Then add the following code at the top

User = get_user_model()

0đź‘Ť

In my case, the issue was due to the way my app’s forms.py was set up.

I found the cause of the error, and added it. See comment in code:

from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import get_user_model


class RegisterForm(UserCreationForm):
    class Meta(UserCreationForm.Meta):
        model = get_user_model() #### I included this,VERY IMPORTANT
        fields = ("email",)

It was missing initially, hence the reason for the error.

If you’ve noticed, my class RegisterForm extends UserCreationForm

And UserCreation extends a Base class, BaseUserCreationForm

BaseUserCreationForm in turn has a Meta subclass with a model = User.

By default, that models points to django.contrib.auth.models.User

which is not something you want, since you’re already using a custom class.

-4đź‘Ť

All the solutions provided above did not work in my case. If you using Django version 3.1 there is another solution for you:

In auth/forms, comment out line 10 and change the model in line 104 & 153 to your defined model.

Leave a comment