2017-09-16 42 views
1

我希望能够为教师提交评论。我有2种型号:Django:表单处理错误。处理与另一个模型关联的表格

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我有以下形式处理:

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: 

出于某种原因,我似乎也得到了其他循环。例如。该表格无效。

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' object does not support item assignment

+1

在您的'ReviewForm'中使用'model = Review',但是在初始数据中您提供了'Teacher'模型的实例 –

+0

你的意思是实例=老师部分?即使它不在那里,我仍然无效 – Roma

回答

1

看起来你要添加的老师,如果ReviewForm是有效的:

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) 

teacher_detail.html添加,

{{ review_form.errors }} 
+0

谢谢,但它仍然不会重定向或创建审阅。我发布了我的查看功能的全部内容 – Roma

+0

尝试在控制台上通过在'else'后面添加打印来查看表单错误 –

+0

当我尝试这样做时,功能打印以灰色突出显示,并且当我打印时没有错误提交表格。 – Roma