确认表格重新提交 - Django通过重定向修复

时间:2014-05-15 03:00:33

标签: python django

当我刷新页面或提交后退按钮时,我收到了表单重新提交错误。为了防止在发布请求后发生这种情况,我将其重定向到将显示实际页面的新页面...当我这样做...我点击mainpge.html

上的提交按钮后出现以下错误

错误:     NoReverseMatch at / startpage /

Reverse for 'testpage' with arguments '()' and keyword arguments '{}' not found.

views.py

from django.shortcuts import render_to_response, redirect
from django.views.decorators.csrf import csrf_exempt
from django.template import Context, RequestContext
@csrf_exempt
def mainpage(request):
    return render_to_response('mainpage.html')

@csrf_exempt
def startpage(request):
    if request.method == 'POST':
       print 'post', request.POST['username']
    else:
       print 'get', request.GET['username']
    variables = RequestContext(request,{'username':request.POST['username'],
           'password':request.POST['password']})
    #return render_to_response('startpage.html',variables)
    return redirect('testpage')

def testpage(request):
    variables = {}
    return render_to_response('startpage.html',variables)                                                           

urls.py

urlpatterns = patterns('',
    url(r'^$',mainpage),
    url(r'^startpage',startpage),

startpage.html

<html>
<head>
<head>
</head>
<body>
<input type="submit" id="test1" value="mainpage">
This is the StartPage
Entered user name ==   {{username}}
Entered password  == {{password}}
</body>
</html>

mainpage.html

<html>
<head>
</head>
<body>
This is the body
<form method="post" action="/startpage/">{% csrf_token %}
Username: <input type="text" name="username">
Password: <input type="password" name="password">
<input type="submit" value="Sign with password">
</form>
</body>
</html>

1 个答案:

答案 0 :(得分:0)

根据docsredirect采用以下三种方式之一:

  1. 模型:将调用模型的get_absolute_url()函数。
  2. 视图名称,可能带参数:urlresolvers.reverse将用于反向解析名称。
  3. 绝对或相对网址,将用作重定向位置的原样。
  4. 通过传递一个不是以协议开头并且不包含斜杠的字符串,该参数被识别为名称,并传递给reverse

    这里的措辞可能有点误导。 reverse通过网址模式名称查找视图,因此当文档显示视图名称时,它实际上意味着的名称指向视图的URL模式,而不是视图本身的名称。由于reverseurlpatternsurls.py}中查找了网址格式,因此您需要在其中添加testpage,以便reverse找到它:

    url(r'^whatever/$', testpage, name='testpage')
    

    显然你可以在第一个参数中放置你想要的任何模式,并且需要为第二个参数导入视图函数。 name部分是reverse用于查找网址的内容。