2009-09-03 96 views
9

我的URLconf包含以下模式:Django的“网址”模板标签错误

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参数。我确信我错过了一些明显的东西,但我不确定它是什么。

回答

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”,而该参数默认为字符串“下一个”。因此,以您的urlconf方式,您可以在您的模板中执行下列操作:

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

非常感谢。不知道我是如何忽视REDIRECT_FIELD_NAME的。 – saturdayplace 2009-09-03 16:05:57

5

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

现在,你的url模式中没有这个参数的地方。

即你可以调用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"), 

希望帮助!