根据 回答 :
再次,我们用它 is_bound
来检查表单是否能够通过验证。请参阅 文档的这一部分 :
装订表格和非装订表格
表单实例要么绑定到一组数据,要么不绑定。
-
如果它绑定到一组数据,它就能够验证该数据并将数据显示在 HTML 中,并将表单呈现为 HTML。
-
如果未绑定,它就无法进行验证(因为没有数据需要验证!),但它仍然可以将空白表单呈现为 HTML。
我们使用元组列表来表示表单对象及其详细信息,以实现更高的可扩展性和更少的重复性。
我们不会重写 , get()
而是重写 get_context_data()
,使将表单的新空白实例(带前缀)插入到响应中成为任何请求的默认操作。在 POST 请求的上下文中,我们重写该 post()
方法以:
-
使用
prefix
检查每个表单是否已提交
-
验证已提交的表单
-
使用
cleaned_data
-
数据
context
将所有无效的表单返回到响应中
# views.py
class MultipleForms(TemplateResponseMixin, ContextMixin, View):
form_list = [ # (context_key, formcls, prefix)
("form_a", FormA, "prefix_a"),
("form_b", FormB, "prefix_b"),
("form_c", FormC, "prefix_c"),
...
("form_x", FormX, "prefix_x"),
]
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# Add blank forms to context with prefixes
for context_key, formcls, prefix in self.form_list:
context[context_key] = formcls(prefix=prefix)
return context
def post(self, request, *args, **kwargs):
# Get object and context
self.object = self.get_object()
context = self.get_context_data(object=self.object)
# Process forms
for context_key, formcls, prefix in self.form_list:
if prefix in request.POST:
# Get the form object with prefix and pass it the POST data to \
# validate and clean etc.
form = formcls(request.POST, prefix=prefix)
if form.is_bound:
# If the form is bound (i.e. it is capable of validation) \
# check the validation
if form.is_valid():
# call the form's save() method or do whatever you \
# want with form.cleaned_data
form.save()
else:
# overwrite context data for this form so that it is \
# returned to the page with validation errors
context[context_key] = form
# Pass context back to render_to_response() including any invalid forms
return self.render_to_response(context)
@ybendana 的答案 不起作用 .
类中,将 Mixin 对象作为属性并像上面一样进行挂钩, form_list
并 get_context_data()
不会花费太多工作量 post()
。
编辑:这已经存在。请参阅 此存储库 .
注意: 此方法需要 TemplateResponseMixin
和 render_to_response()
才能 ContextMixin
工作 get_context_data()
。请使用这些 Mixin 或 从它们派生的 CBV