2009-09-03 143 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"), 

希望幫助!