Django用变量重定向到站点根....

时间:2012-10-01 13:19:11

标签: django redirect root reverse

我正在尝试将浏览器重定向回站点根目录,并传递一个变量以触发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。

如果有人能告诉我如何解决这个问题,我将非常感激。

2 个答案:

答案 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',))