сигнал post_save для уточнения c Профиль модели для регистрации пользователя - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть 2 модели профиля (Profile1 и Profile 2) с отношением один к одному с классом django User. У меня есть 2 отдельные регистрационные формы, 2 разных сигнала, 2 разных вида / маршрута для каждой модели. Когда я регистрирую пользователя в Profile1, он создает экземпляр Profile1, но также создает экземпляр Profile2. Как я могу указать сигнал для использования в зависимости от типа регистрации пользователя?

Вот мой signal.py для Profile1

@receiver(post_save, sender=User)
def create_profile1(sender, instance, created, **kwargs):
    if created:
        Profile1.objects.create(customer=instance)

@receiver(post_save, sender=User)
def save_profile1(sender, instance, created, **kwargs):
    instance.profile1.save()

Вот мой signal.py для Profile2

@receiver(post_save, sender=User)
def create_profile2(sender, instance, created, **kwargs):
    if created:
        Profile2.objects.create(customer=instance)

@receiver(post_save, sender=User)
def save_profile2(sender, instance, created, **kwargs):
    instance.profile2.save()

Ниже представлены 2 вида из отдельных файлов вида

# view for registration of Profile1
def register(request):
    if request.method == 'POST':
        u_form = RegisterForm(request.POST)
        p_form = ProfileRegisterForm(request.POST)
        if u_form.is_valid() and p_form.is_valid():
            user = u_form.save()
            user.refresh_from_db() 
            p_form = ProfileRegisterForm(request.POST,
                                       instance=user.profile1)  
            p_form.full_clean()  
            p_form.save() 

            messages.success(request, 'Your account has been created!')
            return redirect('profile1_login')
    else:
        u_form = RegisterForm()
        p_form = ProfileRegisterForm()

    context = {
        'u_form': u_form,
        'p_form': p_form
    }
    return render(request, 'profile1/register.html', context)


# view for registration of Profile2 
def register(request):
    if request.method == 'POST':
        u_form = RegisterForm(request.POST)
        p_form = ProfileRegisterForm(request.POST)
        if u_form.is_valid() and p_form.is_valid():
            user = u_form.save()
            user.refresh_from_db()  
            p_form = ProfileRegisterForm(request.POST,
                                                 instance=user.profile2)  
            p_form.full_clean()  )
            p_form.save() 

            messages.success(request, 'Your account has been created!')
            return redirect('profile2_login')
    else:
        u_form = RegisterForm()
        p_form = ProfileRegisterForm()

    context = {
        'u_form': u_form,
        'p_form': p_form
    }
    return render(request, 'profile2/register.html', context)

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

параметр sender в приемнике - это модель User, поэтому каждый раз, когда создается Profile1 или Profile2, это означает, что также создается User, поэтому вызываются оба сигнала.

@receiver(post_save, sender=Profile1)
def create_profile1(sender, instance, created, **kwargs):
    if created:
        Profile1.objects.create(customer=instance)

@receiver(post_save, sender=Profile1)
def save_profile1(sender, instance, created, **kwargs):
    instance.profile1.save()


@receiver(post_save, sender=Profile2)
def create_profile2(sender, instance, created, **kwargs):
    if created:
        Profile2.objects.create(customer=instance)

@receiver(post_save, sender=Profile2)
def save_profile2(sender, instance, created, **kwargs):
    instance.profile2.save()
0 голосов
/ 14 апреля 2020

Так что этот работал. Я просто создал экземпляр внутри представления и передал его в форму.

# view for registration of Profile1
def register(request):
    if request.method == 'POST':
        u_form = RegisterForm(request.POST)
        p_form = ProfileRegisterForm(request.POST)
        if u_form.is_valid() and p_form.is_valid():
            user = u_form.save()

            # ==================CHANGES MADE=====================
            # get fields
            field1 = p_form.cleaned_data.get('field1')

            profile = Profile1Model.objects.create(field1 = field1, ...)

            p_form = ProfileRegisterForm(request.POST,
                                       instance=profile)
            #=====================================================                         

            p_form.save() 
...