我目前正试图在一个页面上有两个表单。我正在使用基于类的视图。
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的多种形式的信息。
如果你能给予我指导和帮助,我将非常感激。谢谢
您的post
方法对第二种形式不做任何事情。您需要实例化它并检查它的有效性,就像处理第一个一样。
在一个页面上拥有多个表单的一个非常简单的方法是定义一些隐藏参数来区分您的POST操作,如:
<input name="formType" type="hidden" value="note">
在CBV post方法中,您可以:
form_type = request.POST.get('formType', None)
if form_type == 'note':