Добавление профиля для пользователя в django - PullRequest
0 голосов
/ 02 октября 2019

После этого:

https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html#onetoone

У меня возникли некоторые проблемы с этим вызовом:

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

В их примере я предполагаю, что это работает, как нарегистрация новой учетной записи, потому что профиль в их примере имеет все поля, которые могут быть пустыми и нулевыми. В моем случае мой профиль, который я пытаюсь сохранить здесь, называется:

class APOUser(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    institution =  models.ForeignKey("mainpage.InstitutionMember", on_delete=models.PROTECT)
    gender = models.ForeignKey("mainpage.GenderTable", on_delete=models.PROTECT)
    on_site_status = models.ForeignKey("mainpage.SiteStatus", on_delete=models.PROTECT)
    refer_to_as = models.TextField(max_length = 30, blank=True) #if the above is custom
    room_preference  = models.ForeignKey("housing.Room", on_delete=models.PROTECT)

, который в конечном итоге ссылается на то, что будет в выпадающем списке для выбора формы (заполняется другой таблицей со значениями по умолчанию). Итак, я могу удалить @reciever, а затем просто попросить пользователей как-то отдельно заполнить профиль после регистрации и подтвердить свою учетную запись?

Я пытался смешать форму регистрации с формой профиля ... но продолжал получатьу анонимного пользовательского объекта не было атрибута объекта apouser в views.py, когда я пытаюсь смешать формы регистрации и формы профиля:

 def signup(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        profile_form = ProfileForm(request.POST, instance=request.user.apouser)

        if form.is_valid() and profile_form.is_valid():
            user = form.save(commit=False)
            user.is_active = False
            user.save()
            profile_form.save()
            current_site = get_current_site(request)
            mail_subject = 'Activate your APO account.'
            message = render_to_string('acc_active_email.html', {
                'user': user,
                'domain': current_site.domain,
                'uid':urlsafe_base64_encode(force_bytes(user.pk)),
                'token':account_activation_token.make_token(user),
            })
            to_email = form.cleaned_data.get('email')
            email = EmailMessage(
                        mail_subject, message, to=[to_email]
            )
            email.send()
            return redirect('plsactivate')
            #return HttpResponse('Please confirm your email address to complete the registration')
            #form.save()
            #username = form.cleaned_data.get('username')
            #raw_password = form.cleaned_data.get('password1')
            #user = authenticate(username=username, password=raw_password)
            #login(request, user)
            #return redirect('/')
    else:
        form = SignUpForm()        
        profile_form = ProfileForm(instance=request.user.apouser) #<-- error here
    return render(request, 'signup.html', {'form': form, 'profile_form': profile_form})
    #return render(request, 'signup.html', {'form': form})

Так что не уверен, как правильно поступить, что мне нужно. У меня обычный пользователь по умолчанию с базовыми вещами, которые предлагает стандартная регистрация django. Тогда у меня есть APOUser с дополнительным материалом (обычно заполняется в профиле), но я не уверен, где / как заставить пользователей заполнить его.

При регистрации выдает ошибку анонимного пользователя

После регистрации не позволяет @reciever работать, потому что ничего из APOUuser не заполнено?

1 Ответ

1 голос
/ 02 октября 2019

Да, удалите приемник - хотя это и не является причиной этой конкретной проблемы, она вызовет проблемы, как только вы исправите это

Причина вашей ошибки в том, что она говорит: так как вы этого не делаетеу вас есть залогиненный пользователь, у вас тоже нет профиля. Но вам это не нужно;здесь не нужно передавать аргумент экземпляра.

Что вам нужно сделать , это настроить пользователя на результат сохранения формы профиля - так же, как выустановите is_active в результате сохранения пользовательской формы.

Итак:

if request.method == 'POST':
    form = SignUpForm(request.POST)
    profile_form = ProfileForm(request.POST,)

    if form.is_valid() and profile_form.is_valid():
        user = form.save(commit=False)
        user.is_active = False
        user.save()
        profile = profile_form.save(commit=False)
        profile.user = user
        profile.save()
        ...
else:
    form = SignUpForm()        
    profile_form = ProfileForm()
...
...