0

我正在使用 django-formtools 将长表格分成几部分。这工作正常。但是,我希望用户能够开始填写表单,直到我们说第 5 步(共 9 步),然后注销并再次登录,然后从第 5 步开始继续填写表单。

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

如果我使用会话而不是 cookie,那么当用户注销时,将无法从第 5 步开始继续填写表单,因为会话已刷新并且数据已删除。所以我想这些会议在这里对我没有帮助。

为了继续从第 5 步开始填写表格,我重写了以下 get 方法django-formtools.WizardView

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_fill设置urls.py为:

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

所以我的问题是:

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

2.- 在我的情况下,用户 A 和 B 可以看到他们的数据,因为我在 PC 上使用同一台 PC、相同的 Web 浏览器和相同的登录用户,因为我仍在开发网站。但一般来说,用户 A 在 PC 中使用用户 A 的帐户的 cookie 是否与用户 B 在同一台 PC 中使用用户 B 的帐户以及当然使用相同的 Web 浏览器的 cookie 不同?一般而言,如何在 Web 浏览器中为不同用户分离 cookie?

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

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

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

4

1 回答 1

0

听起来像最后一个选项,将表单数据保存到数据库是最直接和安全的方式。表单向导功能有时会分散我对实际需要做的事情的注意力。所以我尝试从另一个角度看待这个任务。

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

  1. 为每个表单创建一个 Django 模型。
  2. 为每个模型创建一个模型表单。
  3. 不知何故(中间件,视图...)检查缺少哪个模型并将用户重定向到下一步。
  4. 根据需要填充最后一个模型时。
  5. 如果所有模型都存在,则不要重定向。
于 2019-11-27T10:13:27.107 回答