Django formtools如何在注销/登录周期之间存储表单数据

时间:2019-11-27 09:54:38

标签: django session cookies django-formtools

我正在使用django-formtools将长格式分割成多个部分。一切正常。但是,我希望用户能够开始填写表单,直到说出第9步中的第5步,然后注销并再次登录,然后继续从第5步开始填写表单。

我可以使用cookie来做到这一点,但是,如果用户A开始填写表单然后注销,然后用户B登录,那么如果用户B选择继续填写表单,则用户B可以看到用户A的数据。如果用户A和B使用相同的计算机和Web浏览器,则会发生这种情况。当然,这不可能发生。

如果我使用会话而不是cookie,那么当用户注销时,由于会话已刷新且数据已删除,因此无法继续从步骤5开始继续填写表格。所以我想会议对我没有帮助。

为了继续从步骤5开始填写表单,我重写了django-formtools.WizardView的get方法:

def get(self, request, *args, **kwargs):
    """ To allow resume editing of a session storaged submissions """
    if self.continue_fill == True:
        try:
            return self.render(self.get_form())
        except Exception as e:
            print(e)
            return super().get(request, *args, **kwargs)
    else:
        return super().get(request, *args, **kwargs)
#---

self.continue_fillurls.py中设置为:

urlpatterns = [
    path(
        'new/', 
        views.SubmissionsWizardView.as_view(), 
        name='submission_new'
    ),
    path(
        'resume/', 
        views.SubmissionsWizardView.as_view(continue_fill=True),
        name='submission_resume',
    ),
]

所以我的问题是:

1.-是否可以在Django中将Cookie与单个用户相关联?

2.-在我的情况下,用户A和B可以看到他们的数据,因为我正在使用同一台PC,同一台Web浏览器和该PC中的同一登录用户,因为我仍在开发站点。但是,总的来说,在PC上使用用户A的帐户的用户A的Cookie与在同一PC上,当然也使用同一Web浏览器的使用用户B的帐户的用户B的cookie是否会不同?通常,如何在网络浏览器中为不同用户分隔Cookie?

3.-是否有可能使用会话进行这项工作(注销/登录继续填充)?

4.-如果我想允许用户在不同的填充步骤中拥有多个表单实例怎么办? django-formtools支持吗?

5.-我想我可以创建一个表来临时将数据存储在表单中并将该行与用户相关联,然后为表单中的每个步骤更新该行,或者覆盖注销方法以确保cookie / session数据存储在DB中。这将允许用户保存几个已保存的表单,这些表单可以继续编辑,但这是很多工作。还有更简单的选择吗?

1 个答案:

答案 0 :(得分:0)

像最后一个选项一样,将表单数据保存到数据库中的声音是最直接,最安全的方法。表单向导功能有时会分散我的实际精力。所以我尝试从另一个角度看任务。

对我来说,这是最简单的解决方案:

  1. 为每种表单创建一个Django模型。
  2. 为每个模型创建一个模型表单。
  3. 以某种方式(中间件,视图...)检查缺少的模型,并将用户重定向到下一步。
  4. 根据需要填充最后一个模型。
  5. 如果所有模型都存在,则不要重定向。