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:
-
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.
-
The
include = ()
part is required, or you can addexclude = ()
, but you have to have one
- [Django]-Filtering using viewsets in django rest framework
- [Django]-How to output Django queryset as JSON?
- [Django]-How to get value from form field in django framework?
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…
- [Django]-Django – what is the difference between render(), render_to_response() and direct_to_template()?
- [Django]-Django template display item value or empty string
- [Django]-Dynamic choices field in Django Models
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()
- [Django]-How to use MySQLdb with Python and Django in OSX 10.6?
- [Django]-Checking for empty queryset in Django
- [Django]-POST jQuery array to Django
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.
- [Django]-Where should signal handlers live in a django project?
- [Django]-What's the idiomatic Python equivalent to Django's 'regroup' template tag?
- [Django]-Cannot access django app through ip address while accessing it through localhost
-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.
- [Django]-How can I get the full/absolute URL (with domain) in Django?
- [Django]-Django models: Only permit one entry in a model?
- [Django]-Malformed Packet: Django admin nested form can't submit, connection was reset