【问题标题】:django, return to previous page after form POST submitdjango,表单POST提交后返回上一页
【发布时间】:2012-03-06 15:48:46
【问题描述】:

在我的网页中,我有一个表单,该表单在一些 ajax 请求后填充了数据。例如,当用户从列表中选择一个项目时,会向数据库发送一个简单的 ajax 请求,表明该项目已被选中(但尚未确认)。然后使用简单的 ajax 请求(只是列表,而不是整个页面)重新加载网页上的列表以获取新项目列表。

我认为这或多或少是一个经典的购物车实现。

但是,当用户按下提交(经典表单 POST 提交,而不是 ajax POST,由于某些与实施有关的原因)来确认整个列表时,我想返回当前页面。 (当前页面不同)这可能吗?我正在使用 django。

谢谢。

【问题讨论】:

    标签: ajax django


    【解决方案1】:

    提交表单时可以提供nextGET参数,类似于django.contrib.auth的login()方法:

    https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.views.login:

    <form action="/url/to/post/form/?next={{ some_variable }}">
    

    变量可以简单地是当前 URL(取自请求)或生成的 URL。在处理表单的视图中,只需检查 next 参数并适当地重定向:

    from django.shortcuts import redirect
    if 'next' in request.GET:
        return redirect(request.GET['next'])
    

    【讨论】:

      【解决方案2】:

      您也许可以使用发布/重定向/获取设计模式 (PRG)。有关 Post/Redirect/Get 的更多一般信息,请参阅以下内容:http://en.wikipedia.org/wiki/Post/Redirect/Get 那里有一些不错的流程图。

      实现 PRG 的视图的一般示例可能如下所示:

      # urls.py
      urlpatterns = patterns('',
          url(r'^/$', views.my_view, name='named_url'),
      )
      
      # forms.py
      class MyForm(forms.Form):
          pass # the form
      
      # views.py
      def my_view(request, template_name='template.html'):
          """ Example PostRedirectGet 
          This example uses a request context, but isn't 
          necessary for the PRG
          """
          if request.POST:
              form = MyForm(request.POST)
              if form.is_valid():
                  try:
                      form.save()
                      # on success, the request is redirected as a GET
                      return HttpResponseRedirect(reverse('named_url'))
                  except:
                      pass # handling can go here
          else:
              form = MyForm()
      
          return render_to_response(template_name, {
              'form':form
          }, context_instance=RequestContext(request))
      

      如果您需要使用 GET 做一些更有趣的事情,reverse 可以使用 args 和 kwargs。操作视图参数、url_pattern 和反向调用以显示您希望看到的结果。

      还有一点需要注意的是,您不必重定向到同一个视图(如本例所示)。它可以是您希望将用户重定向到的任何命名视图。

      【讨论】:

        【解决方案3】:

        当前页面是一个非常模糊的术语,但我假设您想要将您引至表单页面的页面,这通常(并非总是)存储在请求本身的 HTTP_REFERRER 标头中。您可以尝试从请求中获取它并进行重定向。

        【讨论】:

        • 非常感谢。你说“不总是”,这是为什么呢?
        • 发送引荐来源网址由用户的浏览器决定。有些浏览器没有,或者可以选择禁用它——特别是 Opera。另一个解决方法是将当前路径作为隐藏输入包含在表单中,并在 request.POST 中查找该值。
        猜你喜欢
        • 1970-01-01
        • 2014-05-09
        • 2017-08-28
        • 1970-01-01
        • 1970-01-01
        • 2014-05-26
        • 2021-03-30
        • 1970-01-01
        • 2020-04-07
        相关资源
        最近更新 更多