Praful
Praful

Reputation: 39

Automatically create Django Profile when creating user using signals.py

I have an issue in signals.py. Parameter 'sender' value is not used. and Parameter 'kwargs' value is not used.. In my previous project, this was working fine, But in this project User(AbstractUser) model was introduced in models.py then this issue began.

SIGNALS.PY

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


@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 save_profile(sender, instance, **kwargs):
    instance.profile.save()

Models.py

class User(AbstractUser):
    is_doctor = models.BooleanField(default=False)
    is_public = models.BooleanField(default=False)

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='default.jpg', upload_to='profile_pics')

    def __str__(self):
        return f'{self.user.username} Profile'

    def save(self, *args, **kwargs):
        super(Profile, self).save(*args, **kwargs)

        img = Image.open(self.image.path)

        if img.height > 300 or img.width > 300:
            output_size = (300, 300)
            img.thumbnail(output_size)
            img.save(self.image.path)

VIEWS.PY

@login_required
def profile(request):
    if request.method == 'POST':
        u_form = UserUpdateForm(request.POST, instance=request.user)
        p_form = ProfileUpdateForm(request.POST, request.FILES, instance=request.user.profile)

        if u_form.is_valid() and p_form.is_valid():
            u_form.save()
            p_form.save()
            messages.success(request, f'Your account has been updated!')
            return redirect('public:profile')

    else:
        u_form = UserUpdateForm(instance=request.user)
        p_form = ProfileUpdateForm(instance=request.user.profile)

    context = {
        'u_form': u_form,
        'p_form': p_form,
    }
    return render(request, 'all_users/public/profile.html', context)

Upvotes: 0

Views: 170

Answers (1)

bmons
bmons

Reputation: 3392

since you customized the user the import has to be changed to from django.contrib.auth import get_user_model also you need to add your custom model to settings

AUTH_USER_MODEL = 'myapp.MyUser'

Upvotes: 1

Related Questions