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?
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.