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

时间:2016-01-14 22:15:25

标签: python django forms django-formwizard

背景

我正在构建一个非常大的表单来处理客户提交,因此最终目标是允许用户在以后停止的表单中继续。使用FormWizard(NamedUrlSessionWizardView,实际上)表单完全正常。 Django文档提到最终保存是在done方法中完成的,并将其保留为exercise to the reader。如果用户一次完成此操作,则此操作正常,但如果您希望稍后恢复,则无效。

在我的情况下,电子邮件地址用于查找过去的进度,并向用户发送唯一的链接。这将设置表单并将用户返回到他们中断的位置。只要您的会话仍然有效,这种方法就可以正常工作,但如果不是(不同的计算机等)则不行。我想要做的是在每个步骤之后保存表单数据(这些是ModelForm s)。我会在他们返回时恢复用户的状态。

研究

This answer是我能找到的唯一解决方案,但解决方案与标准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采取行动的正确方法/地点是什么,并在每个步骤后保存表单数据?

1 个答案:

答案 0 :(得分:0)

您可以将数据直接保存到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只是一个书签,您可以使用该书签将用户引导回到正确的步骤。您应该从done方法中删除任何已保存的字段,这样它们就不会被覆盖。

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

或者,您可以将用户的会话(或相关部分)保存到模型上的session字段中,然后为此编写dispatch方法。注入the relevant information back in的SessionWizardView。我从来没有尝试过,但是如果你可以让它发挥作用,从美学的角度来看可能更为可取,这取决于你需要覆盖多少步骤。

最后,如果您可以依赖您的用户不要清除他们的Cookie并在他们返回时使用相同的浏览器,您可以作弊并设置使用persistent cookies

希望这会让你开始。我有兴趣看看你最终如何让它发挥作用。祝你好运!