防止Django中的多个表单提交

Tho*_*mel 5 python forms django hash

我正在寻找一种通用的方法来防止多个表单提交.我发现这种方法看起来很有希望.虽然我不希望在我的所有观点中都包含此代码段.使用请求处理器或中间件可能更容易做到这一点.

任何最佳做法建议?

Gly*_*son 15

客户端,从JavaScript开始.你永远不能相信客户,但它是一个开始.

onclick="this.disabled=true,this.form.submit();
Run Code Online (Sandbox Code Playgroud)

服务器端你可以'插入一些数据库,即校验和.如果它是一个插入数据库的记录model.objects.get_or_create()用于强制数据库级别的唯一性,那么你应该使用unique_together.

最后:HTTPRedirect是最好的,我在用户处理付款时使用的方法是仅向感谢/确认页面发出HTTPRedirect().这样刷新表单将不会重新提交,如果他们返回并尝试再次提交表单(无需刷新表单),Django Cross Site Request Forgery(CSRF)将失败,完美!

  • 感谢您的回复.HTTPRedirect对于这种情况并没有真正的帮助,因为在post请求中验证表单之后会发生重定向.我想阻止用户两次提交相同的表单(通过在短时间内点击提交按钮两次 - 同时认为表单尚未提交,因为服务器尚未发送resp).然而,最佳做法是在提交帖子后进行重新指导,但出于其他原因.unique_together没有帮助.想一个创建任务的表单.双击表单提交任务会导致两个具有相同值的任务. (2认同)
  • 这不太有效,因为当您禁用提交按钮时,浏览器只会取消表单提交 (2认同)