0

I had created a custom registration form through which I am creating User and I want to create a profile of the user while creating a User. The code is working if I create a profile manually through admin but not creating while creating user. below is my code. please help me out. Models.py


from distutils.command.upload import upload
from email.policy import default
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.contrib.auth.models import User
from PIL import Image
# Create your models here.

class User(AbstractUser):
    is_user = models.BooleanField(default=False)
    is_doctor = models.BooleanField( default=False)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)

class User_reg(models.Model):
    user = models.OneToOneField('User',on_delete=models.CASCADE, primary_key=True)
    fname = models.CharField(max_length=50,blank=False)
    lname = models.CharField(max_length=50,blank=False)
    email = models.EmailField(max_length=100,blank=False)
    address = models.TextField(max_length=500,blank=False)
    gender = models.CharField(max_length=7, blank=False)
    phone = models.CharField(max_length=12,unique=True,blank=False)
    Username = models.CharField(max_length=100,blank=False,unique=True)
    Userpassword = models.CharField(max_length=100,blank=False)
    

    def __str__(self):
        return self.fname

class dr_reg(models.Model):
    user = models.OneToOneField('User',on_delete=models.CASCADE, primary_key=True)
    fname = models.CharField(max_length=50,blank=False)
    lname = models.CharField(max_length=50,blank=False)
    image = models.ImageField(upload_to="image")
    specialisation = models.CharField(max_length=100,blank=False)
    qualificaton =  models.CharField(max_length=100,blank=False)
    phone = models.CharField(max_length=12,blank=False,unique=True)
    gender = models.CharField(max_length=7,blank=False)
    address = models.TextField(max_length=500,blank=False)
    state =  models.CharField(max_length=50,blank=False)
    city = models.CharField(max_length=50,blank=False)
    zip = models.CharField(max_length=50,blank=False)
    email = models.EmailField(max_length=50,blank=False)
    dUsername = models.CharField(max_length=100,blank=False,unique=True)
    dPassword = models.CharField(max_length=100,blank=False)

    def __str__(self):
        return self.fname

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

    avatar = models.ImageField(default='#', upload_to='profile_images')
    bio = models.TextField()

    def __str__(self):
        return self.bio

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

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

        if img.height > 100 or img.width > 100:
            new_img = (100, 100)
            img.thumbnail(new_img)
            img.save(self.avatar.path)

views.py

def dr_register(request):
    if request.method == "POST":
        fname = request.POST.get('dfname')
        lname = request.POST.get('dlname')
        image = request.POST.get('img')
        qualification = request.POST.get('qualification')
        specialist = request.POST.get('specialisation')
        phone = request.POST.get('dphone')
        gender = request.POST.get('dsex')
        address = request.POST.get('dadd')
        state = request.POST.get('state')
        city = request.POST.get('city')
        zip = request.POST.get('zip')
        email = request.POST.get('demail')
        dr_username = request.POST.get('duname')
        dr_password = request.POST.get('dpass')

        mydoctor = User.objects.create_user(dr_username, email, dr_password)
        mydoctor.first_name = fname
        mydoctor.last_name = lname
        mydoctor.is_doctor = True
        mydoctor.save()

        dr_reg.objects.create(fname=fname,lname=lname,image=image, qualificaton=qualification, specialisation = specialist, phone= phone, gender=gender, address=address, state=state, city=city, zip=zip, email=email, dUsername=dr_username, dPassword= dr_password,user=mydoctor)
        # dr_register.save()  
    
        messages.success(request, 'Registeration successful')
        return render(request, 'user/login.html')  

    else:
        return render(request, 'doctor/register.html')

@login_required
def profile(request):
    if request.method == 'POST':
        user_form = UpdateUserForm(request.POST, instance=request.user)
        profile_form = UpdateProfileForm(request.POST, request.FILES, instance=request.user.profile)

        if user_form.is_valid() and profile_form.is_valid():
            user_form.save()
            profile_form.save()
            messages.success(request, 'Your profile is updated successfully')
            return redirect(to='users-profile')
    else:
        user_form = UpdateUserForm(instance=request.user)
        profile_form = UpdateProfileForm(instance=request.user.profile)

        context = {
            'user_form': user_form,
            'profile_form': profile_form
        }

        return render(request, 'user/edit-profile.html', context)

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

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

apps.py

from django.apps import AppConfig

class LoginModuleConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'authenticate_me'

    def ready(self):
        import authenticate_me.signals  

the last line import authenticate_me.signals is displaying in grey color.saying unused import and is not accessed.

  • Your signal sender is configured with `django.contrib.auth.models.User` but you defined your own user model. Try to use your own user model as the sender – Brian Destura Sep 01 '22 at 04:13
  • Can you tell me the necessary code how can I perform this like how I can write my user model? – Ashraf Patel Sep 01 '22 at 09:04

1 Answers1

0

if signals are not firing, it means you have not provided the correct AppConfig to django.

Pick one:

  • hope into your <app_name>/__init__.py and add:

    default_app_config = '<appname>.apps.<AppName>Config'

  • or, add <appname>.apps.<AppName>Config to INSTALLED_APPS instead of <appname>

Zkh
  • 490
  • 1
  • 4
  • 16