【发布时间】:2016-09-09 14:56:03
【问题描述】:
我目前正在尝试在一个页面上放置 两个 表单。我正在使用基于类的视图。
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 的多个表单的信息。
非常感谢一些指导和帮助。
谢谢
【问题讨论】:
-
重新考虑您的设计,因为您的路径会导致混乱。首先,浏览器只会发送两种形式中的ONE。 HTML 不允许嵌套和调整您的模板以将两个表单显示为一个带有两个提交按钮的表单,这很容易出错并且与 Django 表单类的设计背道而驰。这意味着您需要一种在运行时选择要使用的表单的方法,为此有一个完美的方法get_form_class。但到目前为止,最简单的方法是使用 2 个不同的 URL。
-
嗨,Melvyn,这只是 django 特有的问题,单个页面上的多个表单并不真正适合?
-
嗨最大。是和不是。浏览器一次只发送一个表单。从这个角度来看,设计一个页面或视图对象来处理多个表单是没有意义的。特别是因为在两个不同的 URL 上处理两种表单非常容易。如果你有一个 Apple 的 ModelForm 来处理另一个 ModelForm 篮子的外键,那么你应该使用表单集并且只在视图中注册篮子表单。但是从您的问题中,我了解到这两种形式没有关系,而是完成了两个不同的任务。