使用 Django FormWizard 在每个步骤中保存表单数据
Save form data on every step using Django FormWizard
背景
我正在构建一个非常大的表单来处理客户提交的内容,因此最终目标是允许用户日后从他们离开的地方恢复表单。该表单使用 FormWizard(实际上是 NamedUrlSessionWizardView
)功能齐全。 Django 文档提到最终保存是在 done
方法中完成的,并将其保留为 exercise to the reader。如果用户一次完成此操作,则此方法可以正常工作,但如果您想稍后恢复此操作,则不行。
在我的例子中,一个电子邮件地址用于查找过去的进度,并向用户发送一个唯一的 link。这将设置表单并 return 将用户带到他们离开的地方。只要您的会话仍然有效,这就可以正常工作,但如果不是(不同的计算机等),则不会。我想做的是在每一步之后保存表单数据(这些是 ModelForm
s)。我会在 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。
希望这能让您入门。我很想知道您最终是如何让它发挥作用的。祝你好运!
背景
我正在构建一个非常大的表单来处理客户提交的内容,因此最终目标是允许用户日后从他们离开的地方恢复表单。该表单使用 FormWizard(实际上是 NamedUrlSessionWizardView
)功能齐全。 Django 文档提到最终保存是在 done
方法中完成的,并将其保留为 exercise to the reader。如果用户一次完成此操作,则此方法可以正常工作,但如果您想稍后恢复此操作,则不行。
在我的例子中,一个电子邮件地址用于查找过去的进度,并向用户发送一个唯一的 link。这将设置表单并 return 将用户带到他们离开的地方。只要您的会话仍然有效,这就可以正常工作,但如果不是(不同的计算机等),则不会。我想做的是在每一步之后保存表单数据(这些是 ModelForm
s)。我会在 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。
希望这能让您入门。我很想知道您最终是如何让它发挥作用的。祝你好运!