RelatedObjectDoesNotExist: User has no userprofile
If you are getting this error even if you've tried the suggestions above, it may caused by the fact that the first user you had created (with createsuperuser command) does not have a profile.
I was getting this error when I tried to login with that user. I solved it this way:
-Create a new user.
-Undo the changes. (Erase the code you've written for Profile or make them comment lines)
-Log in to your superuser.
-Give admin authorization to newly created user.
Now you can delete the first user. (The user with no profile)
First Register profile model in admin.py if not already done.
Create new superuser using ./manage.py createsuperuser.
Log in with new superuser.
From Admin panel click Profile and add new entry and selct user from user dropdown and save.
Nothing in what you've done forces the creation of a UserProfile
object when a User
is created. There are two basic ways of handling this:
If you always want a
UserProfile
to exist (which seems like the case as you give adefault
value toscore
, create apost_save
handler that creates a new profile when ever theUser
object is created (but not every time it's saved, so make sure to check thecreated
argument in the handler).If it's expected a user may not have a profile, you need to catch the
UserProfile.DoesNotExist
exception when trying to access it. If you do this frequently, make some kind of helper function.
UPDATED TO ANSWER SIGNAL QUESTION
It also looks like somewhere around here
post_save.connect(create_profile, sender=User)
should be added?
You would need to define a function called create_profile
and then wire it up as you have shown. I typically do this right in the models.py
file that includes the sender
but in this case where the sender is a built-in Django model and you're already importing that model into the file where you define your UserProfile
that's the place to do it. It would look something like:
def create_profile(sender, instance, created, *args, **kwargs):
# ignore if this is an existing User
if not created:
return
UserProfile.objects.create(user=instance)
post_save.connect(create_profile, sender=User)
You have to create a userprofile
for the user first:
profile = UserProfile.objects.create(user=request.user)
In your views.py
you can use get_or_create
so that a userprofile
is created for a user if the user doesn't have one.
player, created = UserProfile.objects.get_or_create(user=request.user)
UPDATE: For automatically creating user profiles every time a new user is made, use signals.
In myapp/signals.py
do something like this:
@receiver(post_save, sender=User, dispatch_uid='save_new_user_profile')
def save_profile(sender, instance, created, **kwargs):
user = instance
if created:
profile = UserProfile(user=user)
profile.save()