背景
我正在构建一个非常大的表单来处理客户提交,因此最终目标是允许用户在以后停止的表单中继续。使用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
采取行动的正确方法/地点是什么,并在每个步骤后保存表单数据?
答案 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。
希望这会让你开始。我有兴趣看看你最终如何让它发挥作用。祝你好运!