RelatedObjectDoesNotExist в /auth/profile/ У пользователя нет профиля. (пользователь создан, а профиль нет)

Я создал пользовательскую форму регистрации, через которую я создаю пользователя, и я хочу создать профиль пользователя при создании пользователя. Код работает, если я создаю профиль вручную через администратора, но не создается при создании пользователя. ниже приведен мой код. пожалуйста, помогите мне. 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  

последняя строка import authenticate_me.signals отображается серым цветом, говоря, что импорт не используется и не доступен.

если сигналы не подаются, это означает, что вы не предоставили правильные AppConfig в django.

Выберите один:

  • надежду в свою <app_name>/__init__.py и добавьте:

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

  • или добавьте <appname>.apps.<AppName>Config к INSTALLED_APPS вместо <appname>

Вернуться на верх