【问题标题】:How to make a Django view that does both a GET and POST?如何制作一个同时执行 GET 和 POST 的 Django 视图?
【发布时间】:2013-01-13 19:40:53
【问题描述】:

我正在创建我的 Django 模型对象的实例:myObject。

我已经设置了一个 Django 表单向导来允许用户创建新的 myObjects 实例。

我已经设置了一个视图,允许用户使用如下 GET 对 myObject 进行“下钻”:“myWebsite.com/?objID=5”

在表单向导的最后一步之后,我将用户重定向到“myWebsite.com/?objID=" 到目前为止,一切都很好。有用。但是我有两个新要求:

  1. 如果表单向导刚刚将我重定向到此页面,我希望它在此深入分析页面的顶部显示“这是您新创建的对象”。
  2. 无论天气如何,我都是从表单向导或通过任何其他方式进入此深入研究页面的,我希望 URL 保持与我在上面解释的相同。

要求 #2 我必须使用 POST 以免更改 URL。但原始 URL 需要 GET。所以看来我需要在同一页面上执行 GET 和 POST。我怎样才能做到这一点?我是不是误会了什么?有没有更好的方法让我完成我想做的事情?

【问题讨论】:

标签: django django-views


【解决方案1】:

您实际上不需要同时发出 GET 和 POST 请求。您缺少的是 POST 请求实际上可以具有 GET 参数以及 POST 参数。因此,正如 matino 在 cmets 中指出的那样,这是完全有效的:

<form method="POST" action="myWebsite.com/?objID=5">

在您看来,request.GET 将包含 {'objID': 5}request.POST 将包含您在表单中提交的任何内容。

【讨论】:

  • 我需要在表单向导的 done() 函数中执行此操作。你能告诉我如何改变我的 done() 函数中的 python 代码来完成这个 POST 吗?目前我的 done() 函数如下所示: def done(self, form_list, **kwargs): newObjID = createObj() return HttpResponseRedirect('/?objID=%s' % str(newObjID ))
【解决方案2】:

您不能发出既是 POST 又是 GET 请求的 http 请求。尝试这样做是不好的,并且会破坏互联网。

它违反了RFC2616(http 的 w3c 规范)。 http 提供了一个方法,该方法必须是 'OPTIONS'、'GET'、'HEAD'、'POST'、'PUT'、'DELETE'、'TRACE'、'CONNECT' 之一

虽然这是开发人员经常忽略的原则,但 GET 旨在从服务器检索资源,特别是在不更改服务器上该资源或任何资源的状态的情况下。相反,POST 请求专门用于更改资源的状态。所以 GET 用于查询,POST 用于数据库更改。

【讨论】:

    【解决方案3】:

    这是我使用的:

    # views.py
    def api(request):
        params = request.POST.copy()
        params.update(request.GET)
        # now params has both get and post params merged
    

    【讨论】:

      【解决方案4】:

      request.method 告诉您视图中的请求使用什么 http 方法。所以你可以相应地编码。

      例如

      def my_view(request):
      
          if request.method == 'GET':
              #do processing for get
      
          else if request.method == 'POST':
              #do processing for POST
      
          ...
      

      【讨论】:

      • 没有。我认为你没有理解我的问题。我想同时进行 GET 和 POST。
      猜你喜欢
      • 2021-11-01
      • 1970-01-01
      • 2022-04-21
      • 2016-10-26
      • 2017-06-20
      • 1970-01-01
      • 2017-10-25
      • 2013-05-12
      • 1970-01-01
      相关资源
      最近更新 更多