django'url'模板标签错误

时间:2009-09-03 00:00:50

标签: django url reverse logout

我的URLconf包含以下模式:

url(r'^accounts/logout/$','django.contrib.auth.views.logout', name="logout"),

我试图在带有URL标记的模板中将其反转:

<a href="{% url logout next_page=request.path %}">logout</a>

但我一直收到以下错误:

Reverse for 'logout' with arguments '()' and keyword arguments '{'next_page': u'/first-page/child/'}' not found

我认为django.contrib.auth.views.logout应该选择next_page参数。我确定我错过了一些明显的东西,但我不确定它是什么。

2 个答案:

答案 0 :(得分:7)

是的,你是对的,django.contrib.auth.views.logout接受一个可选的“next_page”参数,但不要忘记“url”标签与urlconf模式匹配,而不是视图,所以它不知道什么是或不是视图的参数。所以这表明你需要在正则表达式中将“next_page”作为上述模式的命名组,你可以这样做,但是有一种更简单的方法来处理重定向......

查看django.contrib.auth.views.logout,您可以看到在没有“next_page”参数的情况下,视图会重定向到request.GET或request.POST中提供的任何url,其中包含“redirect_field_name”键,默认为“REDIRECT_FIELD_NAME”的参数,默认为字符串“next”。因此,保留urlconf的方式,您可以在模板中执行以下操作:

<a href='{% url logout %}?next={{ request.path }}'>logout</a>

答案 1 :(得分:5)

基本上Django的URL调度程序正在查看urlconf和那个参数并说“我不知道在哪里放这个参数”,因为它没有查看url指向的视图函数,只有urlconf和模式在它。

现在,您的网址格式中没有任何地方可用于该论点。

即。你可以用额外的参数调用django.contrib.auth.views.logout,如果你为它编写自己的模式,或者你从你自己的视图中调用它,而不是从它的默认url模式调用它。

其中一个网址模式可能适合您(未经测试):

url(r'^accounts/logout/(?P<next_page>.*)?$','django.contrib.auth.views.logout', name="logout"),
url(r'^accounts/logout/$','django.contrib.auth.views.logout', kwargs={'next_page':None}, name="logout"),

希望有所帮助!