Search code examples
python-3.xdjango-modelsdjango-admindjango-signalsdjango-users

My signals stopped working after extending my default user model using BaseUserAdmin


I had a working signal that creates a new profile when a new user is created, but i wanted to extend the users as either teacher, parent, or Admin, then it stopped working.

Models.py

from django.db import models
from django.contrib.auth.models import User
from PIL import Image
from django.core.validators import MaxValueValidator
from phone_field import PhoneField


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):
        super().save()

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

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



class Parent(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    def __str__(self):
        return '{}, {}'.format(self.last_name, self.first_name)


class Teacher(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    def __str__(self):
        return '{}, {}'.format(self.last_name, self.first_name)

Admin.py

from django.contrib import admin
from .models import Profile, Student, Teacher, Parent
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User

class ParentInLine(admin.TabularInline):
    model = Parent
    can_delete = False
    verbose_name_plural = 'parent'

class TeacherInLine(admin.TabularInline):
    model = Teacher
    can_delete = False
    verbose_name_plural = 'teacher'


class UserAdmin(BaseUserAdmin):
    inlines = (ParentInLine, TeacherInLine)

admin.site.unregister(User)
admin.site.register(User, UserAdmin)

admin.site.register(Profile)
admin.site.register(Teacher)
admin.site.register(Parent)

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

@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()

Apps.py

from django.apps import AppConfig

class UsersConfig(AppConfig):
    name = 'users'

    def ready(self):
        import users.signals

There are no errors, but i just cant let it automatically create a profile for whenever a new user is created. Is there something i am doing wrong? Or something that i need to do?


Solution

  • I've found a solution for my problem. What I did was editing my "create_profile" function.

    From:

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

    To:

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

    Then I added in my

    init.py

    default_app_config = 'users.apps.UsersConfig'
    

    Then it started working. I've been stuck with this particular problem for 4 days and I am basically a newbie with 2 to 3 weeks of django experience. Hope this will help others if you come upon the same problem.