我正在尝试将浏览器重定向回站点根目录,并传递一个变量以触发JS通知功能......这就是Django。
我现在拥有的是:
urls.py:
url(r'^accounts/password/reset/complete/$', views.passwordResetComplete,
name='password_reset_complete'),
views.py:
def passwordResetComplete(theRequest):
return redirect(home(theRequest, 'Password reset successful'))
def home(theRequest, myMessage=None):
.........
return render_to_response('new/index.html',
{
"myTopbar": myTopbar,
"isLoggedIn": isLoggedIn,
"myMessage": myMessage
},
context_instance=RequestContext(theRequest)
)
我收到此错误:
NoReverseMatch: Error importing 'Content-Type: text/html; charset=utf-8.......(gives full HTML of page)
我一直在研究几种不同的解决方案,似乎没有任何方法可以按照我需要的方式工作。我最接近的是使用root中的JS函数重定向到'/?query-string'以检查该查询字符串并运行该函数(如果它存在)。但是,在用户导航站点的持续时间(即100%AJAX)中,会在URL中保留查询字符串。我想避免在URL中有任何字符串/长href。
如果有人能告诉我如何解决这个问题,我将非常感激。
答案 0 :(得分:3)
HTTP是一种无状态协议,这意味着每个请求都是完全唯一的,并且与以前曾经做过的任何事情和事情分开。更简单地说,使用URL“传递变量”的唯一方法(在HTTP中)是将其添加到URL本身(/someobject/1/
,例如,其中1
是对象ID)或者在查询字符串(?someobject=1
)中。无论哪种方式,信息都嵌入在 URL 中,由您的应用程序来解析URL中的信息并对其进行操作。
“会话”的概念是作为向无状态协议(即HTTP)提供状态的一种方式而引入的。它的工作方式是服务器向客户端发送一个包含一些可识别信息的cookie(通常只是一个会话ID)。然后,客户端在每个请求的请求标头中将cookie发送回服务器。服务器看到cookie,查找会话并继续与正在进行的任何操作无缝连接。这不是真正的状态,但它确实提供了基本上模仿状态的能力,并且它是唯一方式在请求之间传递数据而不实际将数据嵌入URL中。
如果您需要返回的是向用户发送的消息,例如“密码重置成功”,您可以而且应该只使用Django's messages framework,它本身使用会话传递消息。它为客户端设置cookie,以便您可以重定向到任何URL。 cookie将与新URL的请求一起传回,Django会将会话中的消息添加到模板中适合该URL的位置。
如果你需要实际调用一些JavaScript,那么你应该通过AJAX发出请求。在响应中,您可以通过JSON返回所需的任何数据(并根据您的喜好对该数据进行操作),甚至可以返回要运行的Javascript。
答案 1 :(得分:0)
在redirect docs之后,您不能简单地重定向到视图,而只能重定向到已分配给网址的网址或对象/视图。因此,您有两个选择:
a)直接调用视图:
return home(theRequest, 'Password reset successful')
b)添加类似的Url模式:
url(r'^your_patterns/$', views.home, msg='',name='home'),
然后你就可以做你最初做的事情:
return redirect(views.home,('Password reset successful',))
或者从我的观点来看,甚至更整洁:
return redirect('home',('Password reset successful',))