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

时间:2012-02-15 09:48:37

标签: ajax django

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

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

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

感谢。

3 个答案:

答案 0 :(得分:11)

您可以在提交表单时提供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'])

答案 1 :(得分:1)

您可以使用发布/重定向/获取设计模式(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。操纵视图params,url_pattern和反向调用以显示您想要查看的结果。

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

答案 2 :(得分:0)

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