2017-08-29 5 views
0

現在、Django all-authを使用しています。ユーザ情報を更新するフォームを作成/作成する/ accounts/profileページがあります。ユーザモデルでOneToOneフィールドを使用してユーザプロファイルページを作成

私は、OneToOneフィールドを使用してユーザーモデルを拡張するTeacherフィールドを持っています。

models.py

class Teacher(models.Model): 
    user = models.OneToOneField(User, on_delete=models.PROTECT, related_name='Teacher') 
    bio = models.TextField(max_length=500, blank=True) 
    availability = models.BooleanField(default=False) 
    teacher_logo = models.FileField() 

この教師のモデルは、私は、ユーザーが/アカウント/プロファイルに更新したいものです。

forms.py

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

class TeacherForm(forms.ModelForm): 
    class Meta: 
     model = Teacher 
     fields = ('availability', 'bio','teacher_logo') 

views.py

@login_required 
@transaction.atomic 
def update_profile(request): 
    if request.method == 'POST': 
     user_form = UserForm(request.POST, instance=request.user) 
     teacher_form = TeacherForm(request.POST, instance=request.user.teacher) 
     if user_form.is_valid() and teacher_form.is_valid(): 
      user_form.save() 
      teacher_form.save() 
      messages.success(request, _('Your profile was successfully updated!')) 
      return redirect('users:index') 
     else: 
      messages.error(request, _('Please correct the error below.')) 
    else: 
     user_form = UserForm(instance=request.user) 
     teacher_form = TeacherForm(instance=request.user.teacher) 
    return render(request, 'accounts/profile.html', { 
     'user_form': user_form, 
     'teacher_form': teacher_form 
    }) 

テンプレートユーザー/ profile.html

<form method="post"> 
    {% csrf_token %} 
    {{ user_form.as_p }} 
    {{ teacher_form.as_p }} 
    <button type="submit">Save changes</button> 
</form> 

urls.py

url(r'^profile/$', views.update_profile, name='Update-Profile') 

それを行うの間違った道を思われる、私は更新ビューを使用することができ、その後私は、URLで指定する必要があります。また、ユーザーは他の誰かのプロフィールを編集することができます。

上記を実行すると、「ユーザー」オブジェクトに属性「先生」がないという申し立てがあります。私は削除

それは、フォームにページをロードしますが、私は更新するとき、それはまだ私に

EDIT(views.pyで両方の場所で削除)と同じ苦情与えTeacherForm(instance=request.user.teacher)から.teacher:models.pyを余分な

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

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

答えて

1

あなたはTeacherとして、関連する名前を設定されているので、あなたが必要とする:

teacher_form = TeacherForm(instance=request.user.Teacher) 
#            ^^^^ 

または「教師」に優れたセットrelated_name

class Teacher(models.Model): 
    user = models.OneToOneField(
     User, 
     on_delete=models.PROTECT, 
     related_name='teacher') 
#      ^^^ 
+1

か、単にデフォルトはとにかく 'teacher'される場合には、全くそれを設定しないでください。 –

+0

ありがとう、私はまだ得ます:例外値:\t 'ユーザー'オブジェクトには属性 'teacher'がありません例外ロケーション:\t /Users/gr/Desktop/PycharmProjects/DjangoWebsite/accounts/models.py save_user_profile、行45行がありません45) – Roma

+0

'Teacher'インスタンスを作成しましたか? –

関連する問題