Amar Mahdi
Amar Mahdi

Reputation: 63

creating a profile for a user in django failed

I'm trying to create a profile for a user in django using signals when the user profile is created I need to create a profile automatically.

from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    picture = models.ImageField(default='default.png',upload_to='profile_pics')
    bio = models.CharField(max_length=200,blank=True)

    def __str__(self):
        return self.user.username

this is in the signals.py file:

from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Profile

@receiver(post_save, sender=User)
def create_profile(sender,instance,created,**kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def create_profile(sender,instance,created,**kwargs):
    instance.profile.save()

and here is the register view:

def registerUserView(request):
    """ this is for registring a new user"""
    if request.method == "POST":
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            messages.success(request,f'your account has been created successfully! you are able to login')
        return redirect("login")
    else:
        form = UserRegisterForm()
        return render(request,"users/register.html",{"form":form})

now I don't know the error that has been occured this time. django version 2.2 and python 3.8.

Upvotes: 0

Views: 46

Answers (1)

Himanshu Patel
Himanshu Patel

Reputation: 640

Inside your signals.py

# make required imports

@receiver(post_save, sender=User)
def create_profile(sender,instance,created,**kwargs):
    if created:
        profile_obj = Profile.objects.create(user=instance)
        profile_obj.save()
        # not sure but check if below line need to be uncommentd
        # instance.profile.save()
'''
delete another signal both are invokes at same time also second 
one is making infinite recursion 
(user save -> save profile -> user save  -> save profile ...)
'''

Upvotes: 1

Related Questions