Django OneToManyField ProfileUpdate интеграция с регистрацией пользователей
У меня проблемы с интеграцией информации из формы регистрации пользователя с другой формой, используемой в качестве средства обновления профиля Models.py
class Profile(models.Model):
skill_choices = (('Beginner', 'BEGINNER'),
('Intermediate', 'INTERMEDIATE'),
('Expert', 'EXPERT'))
user = models.OneToOneField(User, on_delete=models.CASCADE)
location = models.CharField(max_length=30, blank=True)
assumed_technical_ski_level = models.CharField(max_length=30, choices=skill_choices)
years_of_experience = models.IntegerField(blank=True)
money_to_spend = models.IntegerField(blank=True)
@receiver(post_save, sender= user)
def create_user_profile(self, sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=user)
def save_user_profile(self, sender, instance, **kwargs):
instance.profile.save()
Views.py
class ProfileUpdateView(LoginRequiredMixin, TemplateView):
profile_form = ProfileForm
template_name = 'aplicatie2/profile-update.html'
def post(self, request):
post_data = request.POST or None
profile_form = ProfileForm(post_data, instance = request.user.profile)
if profile_form.is_valid():
profile_form.save()
return HttpResponseRedirect(reverse_lazy('aplicatie2:lista'))
context = self.get_context_data(profile_form = profile_form)
return self.render_to_response(context)
def get(self, request, *args, **kwargs):
return self.post(request)
Forms.py
class ProfileForm(forms.ModelForm):
class Meta:
model = Profile
fields = ('location', 'assumed_technical_ski_level', 'years_of_experience',
'money_to_spend')
Регистрация осуществляется с помощью стандартной библиотеки django UserCreationForm Я получаю эту ошибку :
RelatedObjectDoesNotExist в /companies/questions/
У пользователя нет профиля.
Кто-то знает решение этой проблемы?
Возможно, save_user_profile вызывается перед create_user_profile. Уберите сигнал save_user_profile, Profile.objects.create (также форма) уже сохраняет экземпляр Profile, поэтому нет необходимости вызывать save. Также измените отправителя сигнала (User, а не user):
сигналы
@receiver(post_save, sender=User)
def create_user_profile(self, sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)