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