【问题标题】:Django: Form Handling Errors. Processing a Form associated with another ModelDjango:表单处理错误。处理与另一个模型关联的表单
【发布时间】:2017-09-16 21:12:12
【问题描述】:

我希望能够为教师提交评论。我有 2 个模型:

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:

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

Urls.py

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

Full 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 中使用model = Review,但在初始数据中您提供Teacher 模型的实例
  • 你的意思是 instance=teacher 部分吗?即使它不存在,我仍然会收到无效的表格

标签: python django django-forms


【解决方案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 }}

【讨论】:

  • 谢谢,但它仍然没有重定向或创建评论。我发布了我的视图功能的全部内容
  • 尝试通过在else之后添加打印来查看控制台中的表单错误
  • 当我尝试这样做时,功能打印以灰色突出显示,并且在我提交表单时没有打印错误。
  • 在我的模板中放入 {{ review_form.errors }} 后,我收到错误:teacher This field is required。所以我假设老师没有正确分配给表格
  • 您在完整视图中显示错误(无效)代码。
猜你喜欢
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 2015-07-04
相关资源
最近更新 更多