Django 3.1, я НЕ получаю ошибку RelatedObjectDoesNotExist для моделей User и Profile

Поскольку заголовок гласит, что я НЕ получаю ошибку RelatedObjectDoesNotExist в Django 3.1(последняя версия). Я не использую сигналы. Я создаю суперпользователя с помощью команды (python manage.py createduperuser), которая, как и ожидалось, не создает профиль.

models.py '' '

class User(AbstractUser):
    pass


class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    birth_date = models.DateField(null=True, blank=True)

'' '

views.py

'' '

class RegisterView(View):

    def get(self, request):
        form = UserSignUpForm()
        # print(form)
        return render(request, 'users/register.html', {'form': form})

    def post(self, request):
        form = UserSignUpForm(request.POST)

        if form.is_valid():
            form.save()

            username = request.POST.get('username')
            Profile.objects.create(user=User.objects.get(username=username))

            return redirect('users:login-page')
        return render(request, 'users/register.html', {'form': form})

'' '

когда я использую команду createduperuser, профиль не создается, поэтому я ожидаю получить RelatedObjectDoesNotExist, если попытаюсь войти в систему. Но я НЕ! почему это? также, если я отредактирую базу данных вручную и удалю профиль и сохраню пользователя, пользователь все равно будет работать без ошибки RelatedObjectDoesNotExist! это то, что изменилось с Django 3.1!

Спасибо

2 ответа

Я действительно нашел проблему. в отсутствие сигналов, соединяющих модели User и Profile, Django не мог определить, что профиль для вошедшего в систему пользователя отсутствует, и никаких ошибок не возникло.

Попробуйте создать новый signal.py в той же папке и сделайте функции create_profile и save_profile ниже, это должно работать.

      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()  
Другие вопросы по тегам