2016-07-02 11 views
2

カスタムユーザーモデルを拡張してプロファイルモデルを作成したアカウントアプリケーションがあります。ユーザーが自分のプロフィール情報を編集できるビューを作成し、対応するUserEditFormとProfileEditFormも持っています。現在のところ、ユーザーはプロフィールを持っていないので、編集フォームを開くと、「RelatedObjectDoesNotExist at/account/edit /」というエラーが表示されます。 "ユーザーにプロファイルがありません" adminを使用してプロファイルを作成しようとしましたが、エラーは消えてしまいます。これを私のviews.pyファイルでどのように修正できますか?RelatedObjectDoesNotExist Djangoでカスタムユーザーモデルを使用中

views.py

@login_required 
def edit(request): 
    if request.method =='POST': 
     user_form = UserEditForm(instance=request.user,data=request.POST) 

     profile_form =  ProfileEditForm(instance=request.user.profile,data=request.POST,files=request.FILES) 

     if user_form.is_valid() and profile_form.is_valid(): 
      user_form.save() 
      profile_form.save() 
      messages.success(request,'Profile updated successfully') 

     else: 
      messages.error(request,'Error updating your profile') 

    else: 
     user_form = UserEditForm(instance=request.user) 

     profile_form = ProfileEditForm(instance=request.user.profile) 


    context = { 
     'user_form':user_form, 
     'profile_form': profile_form 
    } 
    return render(request,'account/edit.html',context) 

models.py

CATEGORY_CHOICES = (
    ('SA','School Admin'), 
    ('T','Teacher'), 
    ('S','Student'), 
    ('P','Parent'), 
) 


class Profile(models.Model): 
    eduser = models.OneToOneField(settings.AUTH_USER_MODEL) 
    photo = models.ImageField(upload_to='users/%Y/%m/%d',blank=True) 
    about_me = models.TextField(max_length=200,blank=True) 
    category = models.CharField(max_length=1,choices=CATEGORY_CHOICES,blank=True) 
    date_of_birth = models.DateField(blank=True,null=True) 

    def __str__(self): 
     return 'Profile for user {}'.format(self.eduser.username) 

forms.py

class UserEditForm(forms.ModelForm): 
    class Meta: 
     model = User 
     fields = ('first_name','last_name','email') 

class ProfileEditForm(forms.ModelForm): 

    class Meta: 
     model = Profile 
     fields = ('category','date_of_birth','about_me','photo') 

答えて

2

あなたは、エラーをキャッチする必要があります。

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

をし、中に両方のブランチ場合ProfileEditFormにそのprofileを渡す:あなたは、関数の先頭にそれを行うことができます。

+0

神様ありがとうございました!私はこれがジャンゴのバグかどうか尋ねたいですか? – Belter

関連する問題