django,在POST表单提交后返回上一页

问题描述:

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

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

但是,当用户按下submit(经典表单POST提交,而不是ajax POST出于某种原因关于实现)来确认整个列表时,我想返回到当前页面。 (当前页面变化)这可能吗?我正在使用Django。

谢谢。

提交表单时,您可以提供一个next GET参数,类似于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']) 

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

+0

非常感谢。你说“不总是”,为什么呢? – xpanta 2012-02-15 10:18:49

+2

由用户的浏览器发送推荐人。有些浏览器没有,或者有一个选项可以禁用它 - 特别是Opera。另一个解决方案可能是将当前路径作为隐藏输入包含在窗体中,并在request.POST中查找该值。 – AdamKG 2012-02-15 10:26:21

您可以使用邮政/重定向/获取设计模式(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可以采取指定参数和kwargs。操纵视图参数,url_pattern和反向调用以显示您希望看到的结果。

另外需要注意的是,您不必重定向到相同的视图(如本例所示)。它可以是您想要将用户重定向到的任何命名视图。