Python 使用Django FormWizard保存每个步骤的表单数据
背景 我正在构建一个非常大的表单来处理客户提交的内容,因此最终的目标是允许用户在以后的某个日期恢复他们停止的表单。使用FormWizard(Python 使用Django FormWizard保存每个步骤的表单数据,python,django,forms,django-formwizard,Python,Django,Forms,Django Formwizard,背景 我正在构建一个非常大的表单来处理客户提交的内容,因此最终的目标是允许用户在以后的某个日期恢复他们停止的表单。使用FormWizard(NamedUrlSessionWizardView)表单功能齐全。Django文档提到最终保存是在done方法中完成的,并将其作为一个示例。如果用户一次性完成此操作,则此操作正常,但如果您希望稍后恢复此操作,则此操作无效 在我的例子中,电子邮件地址用于查找过去的进度,并向用户发送唯一的链接。这将设置表单并将用户返回到他们停止的位置。只要会话仍然有效,这就可以
NamedUrlSessionWizardView
)表单功能齐全。Django文档提到最终保存是在done
方法中完成的,并将其作为一个示例。如果用户一次性完成此操作,则此操作正常,但如果您希望稍后恢复此操作,则此操作无效
在我的例子中,电子邮件地址用于查找过去的进度,并向用户发送唯一的链接。这将设置表单并将用户返回到他们停止的位置。只要会话仍然有效,这就可以正常工作,但如果会话无效(不同的计算机等),则不能正常工作。我想做的是在每个步骤之后保存表单数据(这些是ModelForm
s)。当用户返回时,我将恢复其状态
研究
是我能找到的唯一解决方案,但该解决方案与标准的FormWizard.post()
:
我的问题
在
FormWizard
中采取操作并在每个步骤后保存表单数据的正确方式/位置是什么?您应该能够在执行过程中直接将数据保存到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
字段中,然后为注入的SessionWizardView编写dispatch
方法。我从来没有尝试过,但如果你能让它工作,从美学的角度来看,它可能更可取,这取决于你必须完成多少步骤
最后,如果你可以依靠你的用户不清除他们的cookie,并且在他们返回时使用同一个浏览器,你可以作弊并设置使用
希望这能让你开始。我很想知道你最终是如何让它发挥作用的。祝你好运 编辑:这是对一条评论的回应,该评论很快就被删除了,内容是关于创建我自己的存储来为我做这件事。听起来是一个有趣的想法-我会在
WizardView.process\u步骤(表单)
调用期间创建比正常保存实例更多的问题吗?文档没有说我不应该这样做,但也没有说我应该这样做。不幸的是,我放弃了尝试。使用现有的基于函数的视图手动执行更具时效性。这就是说,这大致是我追求的方向,我认为这可能让我更接近。我开始意识到,我没有重新开始,这造成了很多问题——似乎我覆盖了太多的向导功能,使它变得可靠和可维护。这仍然是我和其他人尝试的一个很好的参考。在这种情况下,a=self.request.user
和b=CustomerModel.objects.get(id=self.request.user.id)
之间有什么区别b
似乎只是一个额外的db查询,但是,我注意到如果您这样做a.first\u name='Travis'
然后a.save()
它在某个点被重置。我知道它已保存到数据库,但在下一次查看时,它会恢复到save调用之前的状态。这是一种Psuedo代码。我想CustomerModel.objects.get(user=self.request.user.id)
会是一个更好的例子。通常有一个额外的模型,它带有一个指向用户
对象的fk链接,该对象包含额外的详细信息,因此直接调用用户
是不起作用的。此外,当您将其写入Formtools的post
方法时,这仅在步骤1中调用。因此,除非您再次调用此额外模型并对其进行处理,否则向导将不会再次触及此模型。
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()