Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Django FormWizard保存每个步骤的表单数据_Python_Django_Forms_Django Formwizard - Fatal编程技术网

Python 使用Django FormWizard保存每个步骤的表单数据

Python 使用Django FormWizard保存每个步骤的表单数据,python,django,forms,django-formwizard,Python,Django,Forms,Django Formwizard,背景 我正在构建一个非常大的表单来处理客户提交的内容,因此最终的目标是允许用户在以后的某个日期恢复他们停止的表单。使用FormWizard(NamedUrlSessionWizardView)表单功能齐全。Django文档提到最终保存是在done方法中完成的,并将其作为一个示例。如果用户一次性完成此操作,则此操作正常,但如果您希望稍后恢复此操作,则此操作无效 在我的例子中,电子邮件地址用于查找过去的进度,并向用户发送唯一的链接。这将设置表单并将用户返回到他们停止的位置。只要会话仍然有效,这就可以

背景

我正在构建一个非常大的表单来处理客户提交的内容,因此最终的目标是允许用户在以后的某个日期恢复他们停止的表单。使用FormWizard(
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()