2017-11-01 16 views
0

私はサインアップページを作成しています。私はデフォルトのUserモデルと追加のユーザーの詳細のためのUserInfoという新しいモデルを使用しています。私は2つのモデルの間にOneToOne関係を確立する必要があります。サインアップページを作成するには、各モデルのフォームを作成し、同じサインアップビューに配置しました。OneToOneの作成同じビューの2つのモデル(フォーム)の関係

私の質問は、UserInfoのユーザー(OneToOneField)をUserInfoと同じビューで作成されているユーザーに設定する方法です。 doesnの - あなたは以下の私のviews.pyに見れば、私は、ユーザーのフォーム(signup_form)を保存した直後、私は...

  • user2.user = User.objects.get(PK = PK)のようないくつかのことを試してみました「Tは
  • user2.user =からrequest.userに動作するように見える -

を動作しませんでした - からrequest.userは、この場合は、匿名ユーザー

  • user2.user =ユーザーであるため、動作しません。 models.py:

    class UserInfo(models.Model): 
    
        TITLE = (
         ('Salesperson', 'Salesperson'), 
         ('Sales Representative', 'Sales Representative'), 
         ('Broker', 'Broker'), 
         ('Broker of Record', 'Broker of Record'), 
        ) 
    
        user = models.OneToOneField(User, on_delete=models.CASCADE) 
        preferred_email = models.EmailField() 
        office_phone_number = models.CharField(max_length=10) 
        brokerage_of_agent = models.CharField(max_length=50) 
        agent_title = models.CharField(max_length=20, choices=TITLE) 
    
        def __str__(self): 
         return self.preferred_email 
    

    forms.py:

    class SignupForm(UserCreationForm): 
        email = forms.EmailField(max_length=200, help_text='Required') 
    
        class Meta: 
         model = User 
         fields = ('username', 'email', 'password1', 'password2') 
    
    class UserInfoForm(forms.ModelForm): 
    
        class Meta: 
         model = UserInfo 
         fields = ['preferred_email', 'office_phone_number', 'brokerage_of_agent', 'agent_title'] 
    

    views.py:

    def signup(request): 
        if request.user.is_authenticated: 
         return HttpResponseRedirect('../dashboard/') 
        if request.method == 'POST': 
         signup_form = SignupForm(request.POST) 
         basic_info_form = UserInfoForm(request.POST) 
         while (True): # The while loop is used to get access to 'break' for the @gmail Email check 
          if signup_form.is_valid(): 
           if not signup_form.cleaned_data['email'].endswith('@gmail.com'): 
            print('You must register with your @gmail.com Email') 
            break 
           user = signup_form.save(commit=False) 
           user.is_active = False 
           user.save() 
    
           ### Look here! I need to write something here I think, but I'm not sure what to write 
           user2 = basic_info_form.save(commit=False) 
           user2.user = User.objects.get(pk=pk) 
           user2 = user2.save() 
    
           current_site = get_current_site(request) 
           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), 
           }) 
           mail_subject = 'Activate your blog account.' 
           to_email = signup_form.cleaned_data.get('email') 
           email = EmailMessage(mail_subject, message, to=[to_email]) 
           email.send() 
           return HttpResponse('Please confirm your email address to complete the registration') 
        else: 
         signup_form = SignupForm() 
         basic_info_form = UserInfoForm() 
    
        return render(request, 'signup.html', {'signup_form': signup_form, 'basic_info_form': basic_info_form}) 
    

    HTMLテンプレート:

    {% extends "base.html" %} 
    {% load static %} 
    
    {% block content %} 
    <h2>Sign up</h2> 
    <form method="post"> 
        {% csrf_token %} 
        {% for field in signup_form %} 
        <p> 
         {{ field.label_tag }}<br> 
         {{ field }} 
         {% if field.help_text %} 
         <small style="display: none">{{ field.help_text }}</small> 
         {% endif %} 
         {% for error in field.errors %} 
        <p style="color: red">{{ error }}</p> 
         {% endfor %} 
        {% endfor %} 
    
        {% for field in basic_info_form %} 
        <p> 
         {{ field.label_tag }}<br> 
         {{ field }} 
         {% if field.help_text %} 
         <small style="display: none">{{ field.help_text }}</small> 
         {% endif %} 
         {% for error in field.errors %} 
        <p style="color: red">{{ error }}</p> 
         {% endfor %} 
        {% endfor %} 
    
    
        <button type="submit">Sign up</button> 
    </form> 
    {% endblock %} 
    
  • +0

    あなたがしたときに起こったことは... 'user2.user = user' – jcfollower

    +0

    while/breakのものはナンセンスです。電子メールがgmail.comで終わるかどうかを調べるには* validation *があり、SignupFormの 'clean_email()'メソッドに属しています。 –

    +0

    @jcfollower lazy whileループを削除したあと、再度 'user2.user = user'を試してみました。私は愚かだと感じる – Valachio

    答えて

    0

    user2.user = userは実際には正解でしたが、不器用なループでは何かが壊れてしまったので、うまくいきませんでした。

    関連する問題