【问题标题】:restricting users from entering into forms限制用户进入表单
【发布时间】:2020-02-10 14:58:27
【问题描述】:

我正在尝试在我的 django 项目中实现某种业务逻辑,其中每个父对象只应创建一个对象的实例。到目前为止,我通过隐藏创建表单的按钮并在事务完成时显示另一个更新按钮来做到这一点。但是,可能会发生某种情况:

  1. 用户 A 和 B 在同一页面中
  2. 用户 A 进入创建视图
  3. 用户 A 填写表格
  4. 用户B页面未刷新,点击进入创建视图按钮
  5. 用户 A 填写表格,退出,按钮切换到更新视图
  6. 用户 B 完成表单,退出,按钮切换到更新视图
  7. 现在创建了 2 个对象。

因此我的问题是,当用户在其中时,有没有办法锁定 createview?

【问题讨论】:

    标签: django django-models concurrency django-views


    【解决方案1】:

    要回答您的问题,是的,您可以锁定视图,例如查看这个 stackoverflow 问题:Allow form submission only once a day django

    但是您可以通过不同的方式实现您的目标,捕获 updateview 处理(如 form_valid 函数:https://docs.djangoproject.com/en/3.0/topics/class-based-views/generic-editing/),并检查是否已经使用该父对象创建了一个对象。如果是这样,请返回 false,并且您不需要为锁定和解锁视图而烦恼。

    【讨论】:

      【解决方案2】:

      您的方案是有效的,但您不应在视图中阻止它。这应该是表单验证的一部分,因为如果它试图创建一个已经存在的对象,那么表单应该是无效的。

      在您的表单中,覆盖 clean() 方法并引发 ValidationError 如果另一个具有相同父对象的对象已经存在。这样,您可以向用户显示有用的错误,例如要求用户刷新页面(然后将隐藏表单)。您的视图不需要任何更改,因为它只是呈现带有错误的无效表单。

      【讨论】:

        猜你喜欢
        • 2012-08-17
        • 2013-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多