2017-05-09 6 views
1

Djangoの新機能です.Djangoのユーザーモデルとユーザー作成フォームを使用してユーザー登録を作成しています。私は余分なフィールド会社名を含めることができるようにDjangoの組み込みユーザーモデルを拡張しようとしています。私はこの繰り返しエラーが発生しました。この問題を解決しようとすると本当に助けに感謝します。RelatedObjectDoesNotExistユーザーにはプロファイルがありません

RelatedObjectDoesNotExistユーザーにはプロファイルを持っていない

(1)ここでProfileモデルの私のModel.pyある

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    Company_name = models.CharField(max_length=30) 


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


@receiver(post_save, sender=User) 
def save_user_profile(sender, instance, **kwargs): 
    instance.profile.save() 

(2)ここに私のviews.py.Iを更新しようとしていますです私は新しいユーザーインスタンスが作成されるたびにプロファイルモデルを作成します。私はcreate_user_profile関数とsave_user_profile関数を自分のビューにリンクする必要があるようですが、これを行う方法があまりにもわかりません。

def Register(request): 
    if request.method == 'POST': 
     User_form = RegisterRecruiterForm(request.POST, instance=request.user) 
     Profile_form = ProfileForm(request.POST, instance=request.user.profile) 
     if User_form.is_valid() and Profile_form. is_valid(): 
      User_form.save() 
      Profile_form.save() 
      return HttpResponse('you are now registered') 
    else: 
     User_form = RegisterRecruiterForm(instance=request.user) 
     Profile_form = ProfileForm(instance=request.user.profile) 
    return render(request, 'Register.html', { 
     'User_form': User_form, 
     'Profile_form': Profile_form 

     }) 

3.こちらは私のforms.pyです。

class RegisterRecruiterForm(UserCreationForm): 

     email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.') 


    class Meta: 
     model = User 
     fields = ('username', 'email', 'password1', 'password2') 


    def save(self, commit=True): 
     user = super(RegisterRecruiterForm, self).save(commit=False) 
     user.email(self.cleaned_data["email"]) 
     user.username(self.cleaned_data["username "]) 
     user.password(self.cleaned_data["password1 "]) 
     user.password(self.cleaned_data["password2 "]) 
     if user.password1 != user.password2: 
      raise forms.validationError("Password do not match") 
     return Profile.Company_name 

     if commit: 

       user.save() 
     return user 


    class ProfileForm(forms.ModelForm): 
     Company_name = forms.CharField(max_length=10,help_text='Required') 

     class Meta: 
      model = Profile 
      fields = ('Company_name',) 

def save(self, commit=True): 
    Profile = super(ProfileForm, self).save(commit=False) 
    Profile.Company_name(self.cleaned_data["Company_name"]) 

    if commit: 

      Profile.save() 
    return Profile 

答えて

1

私が見ることができるように、あなたの問題は、あなたがこの行で「request.user.profile」を取得しようとしているということである:あなたのモデルで

Profile_form = ProfileForm(request.POST, instance=request.user.profile) 

「ユーザー」はありません「プロフィール」ではなく「プロフィール」「ユーザー」を持っているので、このプロファイルを取得するための正しい方法は次のとおりです。

profile = Profile.objects.get(user = request.user) 
Profile_form = ProfileForm(request.POST, instance = profile) 

これは「RelatedObjectDoesNotExist」エラーであなたの問題を解決します。別のエラーが発生した場合は、新しい質問を開くことができます。

最後に、「登録」機能は次のようになります。

def Register(request): 
    if request.method == 'POST': 
     User_form = RegisterRecruiterForm(request.POST, instance=request.user) 
     profile = Profile.objects.get(user = request.user) 
     Profile_form = ProfileForm(request.POST, instance = profile) 
     if User_form.is_valid() and Profile_form. is_valid(): 
      User_form.save() 
      Profile_form.save() 
      return HttpResponse('you are now registered') 
    else: 
     User_form = RegisterRecruiterForm(instance=request.user) 
     profile = Profile.objects.get(user = request.user) 
     Profile_form = ProfileForm(request.POST, instance = profile) 
    return render(request, 'Register.html', { 
     'User_form': User_form, 
     'Profile_form': Profile_form 

     }) 
+0

してください、それはあなたのために働くなら、私に知らせてください。 – Nazkter

+0

- あなたの答えはありがたいですが、変更を加える必要がある場所を教えてください。Profile_form = ProfileForm(request.POST、instance = profile) (views) –

+0

あなたのview.pyファイルで、 "Profile_form = ProfileForm(request.POST、instance = request.user.profile)"という行を私の答えのものに置き換えてください。 – Nazkter

関連する問題