基于Django类的视图多窗体验证

2024-09-28 20:58:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试在一个页面上有两个表单。我使用的是基于类的视图。你知道吗

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())

我目前的状态是,我可以显示所有的表格,只保存笔记表格。我无法保存持续时间窗体,尽管有一个200状态的帖子,但数据没有保存到数据库中。你知道吗

我认为我的错误是,我没有验证它,但我真的不知道如何验证,而且在Django没有太多关于CBV的多种形式的信息。你知道吗

我非常感谢您的指导和帮助。你知道吗

谢谢


Tags: selfformtaskgetreturnobjectdefcontext
2条回答

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

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

在CBV post方法中,您可以:

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

您的post方法对第二种形式没有任何作用。您需要实例化它,并像处理第一个一样检查它的有效性。你知道吗

相关问题 更多 >