提交表单后更改网址,而不使用重定向

时间:2019-04-28 13:57:40

标签: django

提交注册表格后,我希望用户转到感谢/确认页面。

注册表格位于/ register /,确认页面位于/ register / confirm /

我知道我可以这样做:

if register_form.is_valid():
#save data etc.


#SCENARIO 1
#go to the confirmation view
return register_confirm(request)

这将在浏览器中显示确认页面,但是实际URL不会从/ register /更改为/ register / confirm/。

#SCENARIO 2
#redirect to confirmation view
return redirect('register_confirm')

这将在浏览器中显示确认页面,并且实际URL确实从/ register /更改为/ register / confirm /(在@Borut注释后编辑)

#SCENARIO 3
#redirect to URL
return redirect('confirm/')

这将在浏览器中显示确认页面,并且实际URL确实从/ register /更改为/ register / confirm /

因此,根据显示在确认页面中的用户以及浏览器中URL的更改,上述2和3中的方案可以满足我的要求。 (对我来说,很重要的一点是,浏览器中的URL更改有几个原因,但并非最不重要的原因是我希望我的分析结果将点击记录在确认页面上。)

但是,在这种情况下,我真的不认为使用“重定向”是正确的。我只是想将用户移至确认页面(以避免在他们按下刷新时意外重新提交表单)。据我了解,重定向给出的状态代码例如为301或302,这表示该页面已被临时或永久移动。

在仅将用户移动到新页面(即无需实际单击链接的链接)的情况下,注册和确认页面的状态码应为200。我不想搜索引擎以为我正在重定向/ register / URL,例如带有301或302状态代码。

请有人说明如何将用户移动到新页面,并在浏览器窗口中显示不同的URL,但不使用重定向,或者至少不提供30倍的状态代码。

谢谢!

1 个答案:

答案 0 :(得分:0)

好吧,如果您根本不想使用redirect,则可以从确认URL调用注册视图,并呈现其他模板。

您没有透露太多代码,因此这里是一个一般示例:

urls.py

from . import views

path("register/", views.your_register_view)
path("register/confirm/", views.your_register_view)

register_template.html

<form action="register/confirm/" action="post">
  <input type="submit" value="register">
</form>

views.py

def your_register_view(request):
    if request.method == "POST":
        #validate form data here
        return render(request, "confirm_template.html")
    else:
        return render(request, "register_template.html")

基本上,您可以从两个不同的URL调用同一视图,并根据请求类型(POST或GET)呈现模板。