【问题标题】:Django get data from get method and pass to post methodDjango 从 get 方法获取数据并传递给 post 方法
【发布时间】:2018-08-31 05:16:14
【问题描述】:

我正在尝试将数据从 get 方法传递到 post 方法,因此我可以通过表单更新我的数据库数据。在下面的代码中,我特别尝试使用类级别变量“saved_objectID”将editObjectID从get方法传递到post方法。但我总是得到空白值/没有值。

有没有办法实现这个?提前感谢您的帮助

class EditDataView(ListView):
    model =TemporaryModel
    form_class = TemporaryForm
    template_name = 'frontend/editData.html'
    dict = { "EditData":"Edit Data Below"}
    saved_objectID = ''

    def get(self, request, *args, **kwargs):
        editObjectId = request.GET.get('editObjectId')
        editObjects = TemporaryModel.objects.get(pk=editObjectId)
        saved_objectID = editObjectId
        form = TemporaryForm(instance=editObjects)
        return render(request, 'frontend/editData.html', {'form': form,"dict":dict})

    def post(self, request, *args, **kwargs):
        form = TemporaryForm(request.POST, instance=TemporaryModel.objects.get(pk=self.saved_objectID))
        if form.is_valid():
            form.save()
            return render(request, 'frontend/editData.html', {'form': form,"dict":dict})

【问题讨论】:

  • 在 get() 中使用 self.saved_objectID = editObjectId 但不确定类实例是否可用于不同的调用
  • 您可以使用 django 的内置会话框架在来自同一匿名浏览器会话的请求之间持久化数据。你试过吗? django 文档中有示例:docs.djangoproject.com/en/2.1/topics/http/sessions/#examples

标签: python django post get


【解决方案1】:

这取决于您如何部署 django 应用程序。我想在你的情况下,你的 http 服务器使用 process 来服务用户请求。

所以,getpost这两个不同的用户动作在两个不同的进程中,虽然saved_objectID都是EditDataView的类成员,但是这两个EditDataView在两个不同的python进程中。所以,你无法获得价值。

通常情况下,不要让两个不同的请求通过内存中的变量进行通信,即使它可以保持在同一个进程中,因为你改变了 http 服务器部署模式,你仍然无法摆脱其他干扰(例如其他用户请求的顺序) )。

对于您的方案,为什么不使用hidden variablesaved_objectID 返回到用户的浏览器?或者如果您关心安全性,您也可以使用redis,将saved_objectID 作为值存储在redis 中并将密钥返回给用户的浏览器。

一句话,不要使用内存中的变量进行通信,在多进程环境下什么都可以保证,如果你真的需要的话,找一个独立的产品。

【讨论】:

  • redis 解决方案似乎类似于 django 的默认会话框架已经可以实现的解决方案。您可以使用 redis 或 memcached 作为服务器端会话数据的存储后端。
  • 是的,会话也是一个很好的解决方案。只是,如果用户在一个浏览器中打开 2 个帖子一起编辑。使用会话可能需要程序员自己处理不同的键名以避免2个候选帖子的冲突,因为用户的操作可能是GET->GET->POST->POST
  • 非常感谢 atline 和 Haken 的帮助。之前没用过redis,试下回来报告结果。
猜你喜欢
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多