【问题标题】:django class based view multiple form validatiton基于 django 类的视图多表单验证
【发布时间】: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 篮子的外键,那么你应该使用表单集并且只在视图中注册篮子表单。但是从您的问题中,我了解到这两种形式没有关系,而是完成了两个不同的任务。

标签: python django forms


【解决方案1】:

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

【讨论】:

  • 嗨,我不知道该怎么做。你有任何我可以阅读的网址吗?我当前的代码都是来自不同的 tuts 放在一起。
  • 不确定您想要什么网址。您实例化第一个表单并检查它是否有效,现在您需要对第二个表单执行相同操作。
【解决方案2】:

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

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

在您的 CBV 发布方法中,您可以:

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

【讨论】:

    猜你喜欢
    • 2015-07-10
    • 2018-08-31
    • 2021-07-17
    • 1970-01-01
    • 2020-08-25
    • 2015-08-25
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    相关资源
    最近更新 更多