0

我刚开始使用表单集,但在制作用户友好的错误系统时遇到了麻烦。

因此,用户会看到一个列表视图,其中显示了已写入表单集中的模型的所有实例。此页面旨在向他显示数据并对其进行编辑。

在我使用很多单独的表单之前,每个表单都有一个保存按钮。但现在我想改进它以拥有一个为所有表单提供单个保存按钮的表单集。

但是我的问题出现了:在我过去通过“操作”将用户发送到另一个处理请求的 url(例如 .../update/ )然后将他发送回他之前看到的列表视图之前。这是为了避免在按 F5 时多次提交。

但是现在如果我这样做并且只有一个表单是错误的,那么用户输入的所有信息都会丢失。

因此,我停止使用额外的 URL,并将处理作为列表视图的一部分。现在我可以在每个表单上使用 form.error,而且用户在按下 F5 时也可以重新提交。

有没有办法两者兼得?

另外:我有 1 个额外的表格。但是,如果用户更改了它,并且我将 POST 数据输入到表单集中,保存它然后将其放回页面我丢失了额外的表单集,因为现在前一个额外的显示新输入的实例并且没有真正的额外字段离开,直到页面被刷新而不发送帖子数据。

这是我的观点:

class BVServerListView(View):
  def get(self, request):
    eigene_server = Server.objects.filter(user=request.user)
    EigeneServerFormset = modelformset_factory(Server, extra=1, form=ServerForm)
    eigene_server_formset = EigeneServerFormset(queryset=eigene_server)
    context = {'eigene_server': eigene_server_formset,}
    return render(request, 'bildverteiler/server_list.html', context)
  def post(self, request):
    eigene_server = Server.objects.filter(user=request.user)
    EigeneServerFormset = modelformset_factory(Server, extra=1, form=ServerForm)
    eigene_server_formset = EigeneServerFormset(request.POST, request.FILES)
    for form in eigene_server_formset.forms:
      if form.data.get('delete', False):
        server = Server.objects.get(user=request.user, name=form.data['name'])
        server.delete()
      else:
        if form.has_changed() and form.is_valid():
          server = form.save(commit=False)
          server.user = request.user
          server.save()
    context = {'eigene_server': eigene_server_formset,}
    return render(request, 'bildverteiler/server_list.html', context)
4

1 回答 1

0

在这里使用单个表单或表单集没有区别。答案是一样的:发布到同一个视图,但保存成功后重定向。

您在这里做错的另一件事是逐个验证和保存单个表单。不要那样做,因为您最终可能会遇到这样的情况:第一个表单有效并被保存,但后续表单无效,因此需要重新显示表单集。相反,验证整个表单集:

if eigene_server_formset.is_valid():
    for form in eigene_server_formset.forms:
        if form.cleaned_data.get('delete'):
            ... delete ...
        else:
            form.save()
    return HttpResponseRedirect('somewhere_else')
return render...
于 2014-10-01T09:10:42.477 回答