2017-09-16 13 views
1

教師のためのレビューを提出できるようにします。Django:フォーム処理エラー。別のモデルに関連付けられたフォームの処理

def teacher_view(request,**kwargs): 
    teacher = Teacher.objects.get(pk=kwargs['pk']) 
    #if request.method == 'POST': 
    #handle the form 
    review_form = ReviewForm(request.POST, instance=teacher) 
    review_form.teacher=teacher 
    if review_form.is_valid(): 
     review_form.save() 
     return redirect('users:index') 
    else: 
:私は、次のフォームの取り扱いを持って

models.py

class Teacher(models.Model): 
    user = models.OneToOneField(User, on_delete=models.PROTECT, related_name='Teacher') 

class Review(models.Model): 
    teacher = models.ForeignKey(Teacher) 
    #other fields 

    def __str__(self): 
     return self.name 

forms.py

class ReviewForm(forms.ModelForm): 
    class Meta: 
     model = Review 
     #Note no 'teacher' in fields below 
     fields = ('title','star','body') 

views.py:私は2つのモデルを持っています

何らかの理由で、私はまたelseループを取得するようです。例えば。フォームは有効ではありません。

Urls.py

url(r'^(?P<pk>[0-9]+)/$', views.teacher_view, name='detail') 

全Views.py

def teacher_profile(request, **kwargs): 
    teacher = Teacher.objects.get(pk=kwargs['pk']) 
    reviews = Review.objects.filter(teacher_id=kwargs['pk']) 
    star = Review.objects.filter(teacher_id=kwargs['pk']).aggregate(Avg('star')) 
    no_of_ratings = Review.objects.filter(teacher_id=kwargs['pk']).count() 

    if request.method == "POST": 
     if 'booking' in request.POST: 
      form = BookingForm(request.POST) 
      if form.is_valid(): 
       #handle the form 
       return redirect('users:index') 
      else: 
       review_form = ReviewForm() 
     elif 'review' in request.POST: 
      review_form = ReviewForm(request.POST) 
      review_form['teacher']=teacher 
      if review_form.is_valid(): 
       review_form.save() 
       return redirect('users:index') 
      else: 
       form = BookingForm() 
     else: 
      form = BookingForm() 
      review_form = ReviewForm() 
    else: 
     form = BookingForm() 
     review_form = ReviewForm() 

    return render(request, "users/teacher_detail.html", context={"form": form, 
                   "review_form":review_form, 
                   "teacher":teacher, 
                   "reviews":reviews, 
                   "star":star, 
                   "no_of_ratings":no_of_ratings, 
                   }) 

私は再びコードを追加しました。私は自分のviews.pyから貼り付けたコピーを作成しましたが、変数を定義して別のページに成功メッセージでリダイレクトするフォーム処理を削除しました。

私は、フォームが有効かどうか最初にチェックするので、あなたの答えのロジックが間違っていると思います。これは、先生が見つからないために有効ではありません。そして、それが有効かどうかを確認した後、教師を定義します。私はform.is_valid()review_form['teacher']=teacherを追加することで、コードを操作しようとしたが、常にエラーを取得する:あなたはReviewFormが有効な場合、教師を追加するよう

'ReviewForm' object does not support item assignment

+1

'ReviewForm'では' model = Review'を使用しますが、初期データでは 'Teacher'モデルのインスタンスを提供します –

+0

インスタンス=教師の部分ですか?それがない場合でも、私はまだ無効なフォーム – Roma

答えて

1

はルックス:

teacher_detail.htmlアドオンで
def teacher_profile(request,**kwargs): 
    teacher = Teacher.objects.get(pk=kwargs['pk']) 
    reviews = teacher.review_set.all() 
    star = reviews.aggregate(Avg('star')) 
    no_of_ratings = reviews.count() 

    form = BookingForm() 
    review_form = ReviewForm() 

    if request.method == "POST": 
     if 'booking' in request.POST: 
      form = BookingForm(request.POST) 
      if form.is_valid(): 
       #Correct handling 
       return redirect('users:index') 
     elif 'review' in request.POST: 
      review_form = ReviewForm(request.POST) 
      if review_form.is_valid(): 
       review = review_form.save(commit=False) 
       review.teacher = teacher 
       review.save() 
       return redirect('users:index') 
    context = { 
     "form":form, 
     "review_form":review_form, 
     "teacher":teacher, 
     "reviews":reviews, 
     "star":star, 
     "no_of_ratings":no_of_ratings,}) 
    return render(request, "users/teacher_detail.html", context) 

+0

ありがとう、しかしそれはまだリダイレクトやレビューを作成しません。私のビュー機能の完全な内容を投稿しました – Roma

+0

コンソールのフォームエラーを 'else 'の後に追加してみてください –

+0

これをやろうとしたところ、機能の印刷は灰色で強調表示されています。フォームを提出してください。 – Roma

関連する問題