Custom user model in django
Solution 1
I did this in one of my project. I was surprised to see that you extended User because the doc says something else :) You can extend Django User model, but if you only want to add new fields (not change its behavior), you should use a OneToOneField.
If you wish to store information related to User, you can use a one-to-one
relationship to a model containing the fields for additional information.
So, as you can see in the link, your code should look like:
from django.contrib.auth.models import User
class MyUser(models.Model):
user = models.OneToOneField(User)
# Or a ForeingKey to the College table?
college = models.CharField(max_length=40)
other_data = ...
Solution 2
It is a good practice to keep your code generic by using get_user_model() (to get the User model that is active in your project. Defined in django.contrib.auth) and AUTH_USER_MODEL (to reference the User model) rather than directly referring to the User model.
from django.conf import settings
class MyUser(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL)
# Or a ForeingKey to the College table?
college = models.CharField(max_length=40)
other_data = ...
Solution 3
try removing this line in models.py:
admin.site.register(Users, UserAdmin
)
I figured out your error, You have the INSTALLED_APPS in the wrong order they should be the next:
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
#'django.contrib.sites',
#'django.contrib.messages',
'django.contrib.staticfiles',
# Uncomment the next line to enable the admin:
'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
'login',
'forms',
)
AUTH_USER_MODEL = "login.User"
Why?
looking at the source code admin uses the User model so maybe you can think:
But my user model is into login
app and this one is before admin app, therefore login
is installed before admin, why it does not work?. That's because django.contrib.auth
is swappable (the model can be replaced for another one in your case has been swappable by login.User) so as you created a new User Model therefore django has to change its user Model to the new one and then you have to install the rest.
How must be at the moment of run syncdb:
1.- django.contrib.auth is installed, then this see if has been swapped, if yes it adds the new field or override completely the User Model (in your case only you add a field).
2.- admin, contentypes.... your apps, are installed and all works.
How you had it:
1.- login is installed (where the new User Model was, you put the AUTH_USER_MODEL in settings)
2.- Then forms.
3.- Then django tries to install the admin app but it can't because auth_user table hasn't been added that's because django.contrib.auth was after admin, therefore there is no User Model, this one isnt's swapped and this throws the error **admin.logentry: 'user' has a relation with model login.users, which has either
not been installed or is abstract.**
So accordingly first you always have to install the django.contrib.auth
app and then all the apps that depends from.
Related videos on Youtube
Archit Verma
Updated on September 14, 2022Comments
-
Archit Verma about 1 year
I want to create a custom user model using
django.contrib.auth.models.AbstractUser
as stated in the djangodocs:If you’re entirely happy with Django’s User model and you just want to add some additional profile information, you can simply subclass django.contrib.auth.models.AbstractUser and add your custom profile fields. This class provides the full implementation of the default User as an abstract model.
So I inherited the
AbstractUser
class in myUsers
class and added a field. But when I run thepython manage.py syncdb
I get the following error:CommandError: One or more models did not validate: admin.logentry: 'user' has a relation with model login.users, which has either not been installed or is abstract.
I went through other questions on stackoverflow but couldn't resolve the error. Here is my code:
models.py
from django.conf import settings from django.db import models from django.contrib.auth.admin import UserAdmin from django.contrib.auth.models import AbstractUser from django.contrib import admin class Users(AbstractUser): college = models.CharField(max_length=40) admin.site.register(Users, UserAdmin)
admin.py
from django.contrib import admin from django.contrib.auth.admin import UserAdmin from django.contrib.auth.forms import UserChangeForm, UserCreationForm from login.models import Users from django import forms class UsersChangeForm(UserChangeForm): class Meta(UserChangeForm.Meta): model = Users class UsersAdmin(UserAdmin): form = UsersChangeForm fieldsets = UserAdmin.fieldsets + ( (None, {'fields': ('college',)}), ) admin.site.register(Users, UsersAdmin)
settings.py
INSTALLED_APPS = ( 'forms', 'login', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ) MIDDLEWARE_CLASSES = ( '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', ) AUTH_USER_MODEL = 'login.users'
EDIT:
I want to store the user information in the same table as
auth_user
and not in a new table. -
Archit Verma almost 10 yearsActually I wanted to store them in the same table as
auth_user
-
Archit Verma almost 10 yearsI tried it but it didn't work and I am getting the same error message
-
Victor Castillo Torres almost 10 yearsHOw did you order the INSTALLED_APPS? Is admin after auth?
-
Archit Verma almost 10 yearsyup I ordered it the same way you mentioned
-
Victor Castillo Torres almost 10 yearsDo you have a foreign Key to User in the forms app?
-
Charlesliam almost 10 yearsin Django 1.5 you don't need additional table to extend User table.
-
Charlesliam almost 10 years@Victor, I extended the default User table by using
AbstractUser
. The admin run smoothly but when I try to add new user after clicking save I'm getting an errorORA-00942: table or view does not exist
, yet I have a table in my Oracle db and I have it on my Model.py. -
Archit Verma almost 10 years@Victor I don't have any foriegn key to User in forms app
-
Victor Castillo Torres almost 10 years@ArchitVerma I think you have a problem in another place, add me to facebook to see the problem
-
Charlesliam almost 10 yearsI created a synonyms for my current table
CCAD'.
CCAD_OFFICIAL_RECEIPT` toOFFICIAL_RECEIPT
. It's giving me an error if I try to duplicate the table name. So far my problem with saving was caused byDJANGO_ADMIN_LOG
table with a foreign key field name user_id still referencing the oldAUTH_USER
table. I change there reference to my newNAFD_USER
. It's now saving properly. But when I try to delete record i still get this errorORA-00942: table or view does not exist
. Weird..This problem only occured after upgrading from django 1.4.1 to 1.6.>< -
Lara over 7 years@Nil, could you please check this question? :) stackoverflow.com/q/36191737/3350765