使用没有Java脚本和验证的POST向表单集中添加其他表单

问题描述

我想使用Django表单集,但是使用纯服务器渲染,并且不需要Javascript向其添加其他表单。用户只需单击页面上的一个按钮,页面就会重新加载表单集中的其他表单。所有用户输入都应保留!视图中的相关部分是:

if request.POST.get('add_form') == "true":
  cp = request.POST.copy()
  cp['form-TOTAL_FORMS'] = int(cp['form-TOTAL_FORMS']) + 1
  fs = MyFormSet(cp)

问题在于,MyFormSet(cp)呈现表单表示形式时会向其添加验证错误(例如“此字段是必需的”)。这是丑陋的,不能接受的。我该如何呈现它而没有错误(它们应该只在提交整个表单时出现)?

MyFormSet(initial=...)似乎不是一个选择,因为它也必须在UpdateView中工作(文档非常清楚initial仅用于其他形式),并且POST数据也可以不能直接用作初始值。

我非常感谢任何提示,因为这花了我几个小时而无处可寻(这似乎是一个通用功能,因为Django的其余部分是如此,与Javascript无关)。

解决方法

感觉像是黑客,但这可以(在初始化表单集之后):

fs._errors = {}
for form in fs:
  form._errors = {}

这会将所有呈现为HTML的错误从字段中删除。背景是将_errors设置为None(默认设置)时,表单在呈现时会进行自我验证。当将其设置为空dict时,表单将不再对其自身进行验证,而只是“认为”其中没有错误。因此,不会显示任何错误消息。