【问题标题】:Django View - Do an HTTP POST, but do not generate a new pageDjango View - 执行 HTTP POST,但不生成新页面
【发布时间】:2016-03-25 15:27:56
【问题描述】:

我有一个包含一些简单复选框的表单。当我提交时,它会使用post 提供相关信息。 html看起来像这样

<form method="post" id="myForm">
    {% csrf_token %}
    <input type="checkbox" name="choice" id="c1"  value="c1" />
    <input type="checkbox" name="choice" id="c2"  value="c2" />
    <input type="submit" value="Button">
</form>

因此,当我单击按钮时,它会将其提交到后端的同一页面。实际上,我有一些额外的 JQuery 代码将更多参数附加到 POST,并且该代码位于类似于 $('#myForm').submit(function() {}) 的位置。

我使用的是 Django 视图,python 代码如下所示。

class MyView(ListView):
    template_name = "mypage.html"

    ...
    ...

    def post(self, request):
         # retrieve who got checked by looking at POST parameter
         check = request.POST['choice'])

         # make backend call with whatever got checked
         foo(check) 

         # THIS IS NOT WHAT I WANT
         return HttpResponse()

post() 的末尾,我需要返回一个新的HttpResponse,这给了我一个空白页。但这不是我想要的。我只想刷新同一页面。即使什么都不做也没关系——我可以简单地要求用户刷新。

那我该怎么做呢?

【问题讨论】:

  • 很难理解你在问什么。如果您的表单是通过 Ajax 发布提交的,那么它不会刷新。

标签: jquery django forms django-views http-post


【解决方案1】:

在 HTTP POST 之后响应的正确方法是进行重定向。在这种情况下,您可以将 HttpResponseRedirect 返回到页面的 url:

from django.http import HttpResponseRedirect
...
def post(self, request):
     ...
     return HttpResponseRedirect(url_to_the_page)

您可以使用reverse 来避免对网址进行硬编码,并使用messages 来在帖子后显示一条消息。

【讨论】:

  • 这是否意味着我会丢失重定向后已选中的复选框?
  • 是的,HTTP 是一种无状态协议,所以它就是这样工作的。但是,您可以通过 GET 参数(例如“/my/url?checkbox1=checked”)将数据传回视图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 2014-06-28
  • 1970-01-01
  • 2021-12-18
  • 2018-08-04
  • 1970-01-01
  • 2020-07-29
相关资源
最近更新 更多