使用 Django FormWizard 在每个步骤中保存表单数据

Save form data on every step using Django FormWizard

背景

我正在构建一个非常大的表单来处理客户提交的内容,因此最终目标是允许用户日后从他们离开的地方恢复表单。该表单使用 FormWizard(实际上是 NamedUrlSessionWizardView)功能齐全。 Django 文档提到最终保存是在 done 方法中完成的,并将其保留为 exercise to the reader。如果用户一次完成此操作,则此方法可以正常工作,但如果您想稍后恢复此操作,则不行。

在我的例子中,一个电子邮件地址用于查找过去的进度,并向用户发送一个唯一的 link。这将设置表单并 return 将用户带到他们离开的地方。只要您的会话仍然有效,这就可以正常工作,但如果不是(不同的计算机等),则不会。我想做的是在每一步之后保存表单数据(这些是 ModelForms)。我会在 return.

时恢复用户的状态

研究

This answer is about the only solution I can find, but the solution is the same thing that the standard FormWizard.post() method does:

if form.is_valid():
    # if the form is valid, store the cleaned data and files.
    self.storage.set_step_data(self.steps.current, self.process_step(form))
    self.storage.set_step_files(self.steps.current, self.process_step_files(form))

我的问题

FormWizard 中什么是正确的 way/place 来采取行动,并在每个步骤后保存表单数据?

您应该能够将数据直接保存到 ModelForm 中,只需将数据写入 post 方法即可。

if self.steps.current == "form1":
    data = self.request.POST["form1-response"]
    user = CustomerModel.objects.get(id=self.request.user.id)
    user.response = data
    user.form_step = "form1"
    user.save()
在这种情况下,

form_step 只是一个书签,您可以使用它引导用户返回到 return 上的正确步骤。您应该从 done 方法中删除任何 already-saved 字段,这样它们就不会被覆盖。

如果您这样做,您可能需要构建一个 dispatch 方法来在用户重新登录时重建管理表单。

或者,您可以将用户会话(或相关部分)保存到模型的 session 字段中,然后为 SessionWizardView 编写一个 dispatch 方法注入 the relevant information back in。我从未尝试过,但如果你能让它发挥作用,从美学的角度来看,它可能更可取,具体取决于你必须完成多少步骤。

最后,如果您可以让您的用户在 return 时不清除他们的 cookie 并使用相同的浏览器,您也许可以作弊并设置使用 persistent cookies

希望这能让您入门。我很想知道您最终是如何让它发挥作用的。祝你好运!