2017-09-19 26 views
2

私はユーザープロファイルモデルを作成しました。私はモデルをデータベースと同期させるために移行しました。しかし、私がにルーティングするときにUser has no profileのエラーが発生しています。update_profileビューを呼び出す必要があります。requestオブジェクトがPOSTメソッドであるかどうかを確認する前に表示されますが、シェルにも表示されません。私はどこで間違っていますか?RelatedObjectDoesNotExist at/profile

は、ここに私のコード

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    bio = models.TextField(max_length=600, blank=True) 
    location = models.CharField(max_length=30, blank=True) 
    birth_date = models.DateField(blank=True, null=True) 


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


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


class UserForm(forms.ModelForm): 

    class Meta: 
     model = User 
     fields = ('first_name', 'last_name', 'email') 


class ProfileForm(forms.ModelForm): 

    class Meta: 
     model = Profile 
     exclude = ('user',) 


def update_profile(request): 
    print('user ################', request.user, request.user.profile) 
    if request.method == 'POST': 
     user_form = UserForm(request.POST, instance=request.user) 
     profile_form = ProfileForm(
      request.POST or None, instance=request.user.profile) 
     if user_form.is_valid() and profile_form.is_valid(): 
      user_form.save() 
      profile_form.save() 
      messages.success(
       request, ('your profile was successfully updated!')) 
      return redirect('products:profile') 
     else: 
      messages.error(
       request, ('There was an error updating your profile')) 
    else: 
     user_form = UserForm(instance=request.user) 
     profile_form = ProfileForm(instance=request.user.profile) 
    return render(request, 'dashboard/company/profile.html', {'user_form': user_form, 'profile_form': profile_form}) 

答えて

2

申し訳ありませんが、私はちょうど質問を投稿した後、結果を見つけたです。私は質問を削除する必要がある場合、私は確かにそうでない場合は、ここでそれを削除します。この

def update_profile(request): 
    try: 
     profile = request.user.profile 
    except Profile.DoesNotExist: 
     profile = Profile(user=request.user) 
    if request.method == 'POST': 
     user_form = UserForm(request.POST, instance=request.user) 
     profile_form = ProfileForm(
      request.POST or None, instance=profile) 
     if user_form.is_valid() and profile_form.is_valid(): 
      user_form.save() 
      profile_form.save() 
      messages.success(
       request, ('your profile was successfully updated!')) 
      return redirect('products:profile') 
     else: 
      messages.error(
       request, ('There was an error updating your profile')) 
    else: 
     user_form = UserForm(instance=request.user) 
     profile_form = ProfileForm(instance=request.user.profile) 
    return render(request, 'dashboard/company/profile.html', {'user_form': user_form, 'profile_form': profile_form}) 

のためのソリューションです上記のコードで更新された部分は、私ははっきりと説明したが見ていないことができ

try: 
     profile = request.user.profile 
    except Profile.DoesNotExist: 
     profile = Profile(user=request.user) 

ですエラー、プロファイルのRelatedObjectDoesNotexistは私に、request.user.profileが存在するかどうかをチェックするアイデアを与えました。私はこの方法で試してみました。誰もがこの井戸について知っているならば、詳しく説明してください。あなたはやや低いコードのようにそれを書くことができ

0

def update_profile(request): 
    profile = Profile.objects.get_or_create(user=request.user) 
    if request.method == 'POST': 
     user_form = UserForm(request.POST, instance=request.user) 
     profile_form = ProfileForm(
      request.POST or None, instance=profile) 
     if user_form.is_valid() and profile_form.is_valid(): 
      user_form.save() 
      profile_form.save() 
      messages.success(
       request, ('your profile was successfully updated!')) 
      return redirect('products:profile') 
     else: 
      messages.error(
       request, ('There was an error updating your profile')) 
    else: 
     user_form = UserForm(instance=request.user) 
     profile_form = ProfileForm(instance=profile) 
    return render(request, 'dashboard/company/profile.html', {'user_form': user_form, 'profile_form': profile_form})