Post_save не удается создать экземпляр для поля OneToOneField
Пытаясь впервые использовать сигналы, я тестирую сценарий, в котором после создания экземпляра пользователя создается профиль, который привязывается к пользователю. Однако тест не проходит. Я читал похожие вопросы, но там используются два сигнала.
Django создает профиль для пользователя signal
Создайте сигнал post_save, который создает для меня объект профиля
Почему в этих случаях используются два сигнала? Как я могу получить профиль, созданный в моем случае?
from django.test import TestCase
from ..forms import CreateProfileForm
class TestNewUserProfileCreated(TestCase):
'''Verify that a user profile is created once
a user has registered with a username and password.'''
@classmethod
def setUpTestData(cls):
user_submitted_data = {
"username": "MockUser",
"password1": "#hf7*3k",
"password2": "#hf7*3k"
}
cls.form = CreateProfileForm(**user_submitted_data)
cls.user = cls.form.save()
def test_new_user_profile_form_pass(self):
self.assertTrue(hasattr(self.user, 'profile'))
forms.py
class CreateProfileForm(UserCreationForm):
def __init__(self, *args, **kwargs):
pass
def save(self, *args, **kwargs):
pass
class Meta:
pass
models.py
class Profile(Model):
user = OneToOneField(
settings.AUTH_USER_MODEL, on_delete=CASCADE,
related_name="profile"
)
favorite_images = ManyToManyField(
FavoriteImage, related_name="favorites"
)
follows = ManyToManyField("self", related_name="followers")
following = ManyToManyField("self", related_name="following")
receivers.py
from .models import Profile
def create_profile_receiver(sender, instance, created, **kwargs):
if created:
profile = Profile.objects.create(user=instance)
instance.profile = profile
app.py
from django.apps import AppConfig
from django.conf import settings
from django.db.models.signals import post_save
class ImagesConfig(AppConfig):
name = 'images'
def ready(self):
from . import receivers
app_models = self.get_models()
post_save.connect(
receivers.create_profile_receiver, sender=settings.AUTH_USER_MODEL
)
settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'images.apps.ImagesConfig',
]