基于django类的视图多重形式验证

时间:2016-09-09 14:56:04

标签: python django forms

我目前正在尝试在一个页面上包含两个表单。我正在使用基于类的视图。

class TaskDetailView(FormMixin, generic.DetailView):
    model = Task
    template_name="tasks/detail.html"
    form_class = NoteForm
    form_class2 = DurationForm

    def get_context_data(self, **kwargs):
        context = super(TaskDetailView, self).get_context_data(**kwargs)
        context['note_form'] = self.get_form()
        context['notes'] = Note.objects.filter(task__slug=self.kwargs['slug'])
        context['duration_form'] = self.form_class2()
        context['duration'] = Duration.objects.all()
        return context

    def get_success_url(self):
       return reverse('task_detail', kwargs={'slug': self.kwargs['slug']})

    def post(self, request, *args, **kwargs):
        if not request.user.is_authenticated: 
            return HttpResponseForbidden
        self.object = self.get_object()
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

    def form_valid(self, form):
        current_task = get_object_or_404(Task, slug=self.kwargs['slug'])
        self.object = form.save(commit=False)
        self.object.task =  current_task
        self.object.save()
        return HttpResponse(self.get_success_url())

我目前的状态是我能够显示所有表单并仅保存Notes表单。我无法保存持续时间表格,尽管有200个状态的POST,数据没有保存到数据库。

我认为我的错误是我没有验证它,但我真的不确定如何,并且在Django中关于CBV的多种形式的信息不多。

我真的很感激一些指导和帮助。

由于

2 个答案:

答案 0 :(得分:0)

您的post方法对第二种形式没有任何作用。您需要实例化它并检查其有效性,就像使用第一个一样。

答案 1 :(得分:0)

在一个页面上使用多个表单的一种非常简单的方法是定义一些隐藏参数来区分POST操作,例如:

<input name="formType" type="hidden" value="note">

在您的CBV post方法中,您可以:

form_type = request.POST.get('formType', None)
if form_type == 'note':