2009-10-16 74 views
4

夥計們,我得到一個特定的網址調用NoReverseMatch錯誤。如何調試Django NoReverseMatch錯誤?

我想知道:有沒有任何好的工具來調試這些一般?例如,列出哪些URL被註冊的方法?

我具體的例子:

模板:

<a href= 
"{% url django.contrib.auth.views.redirect_to_login blarg %}">log in</a> 

錯誤:

NoReverseMatch: Reverse for 
'settings.django.contrib.auth.views.redirect_to_login' 
with arguments '('[[ UNDEFINED VARIABLE ]]',)' 
and keyword arguments '{}' not found. 

我使用谷歌應用程序引擎與appenginepatch,所以Django的修改。

回答

3

在網址逆轉使用的完整路徑視圖功能這個特殊的情況下,容易的事只是去看看視圖功能。在Django的1.1,這看起來像:

def redirect_to_login(next, login_url=None, 
          redirect_field_name=REDIRECT_FIELD_NAME): 
    "Redirects the user to the login page, passing the given 'next' page" 
    if not login_url: 
     login_url = settings.LOGIN_URL 
    return HttpResponseRedirect('%s?%s=%s' % (login_url, 
               urlquote(redirect_field_name), 
               urlquote(next))) 

此功能甚至不採取一個請求對象,所以它真的甚至沒有一個正確的看法,它甚至沒有django/contrib/auth/urls.py註冊。這意味着它可能只是用作其他視圖中的輔助函數。

在任何情況下,根據您的具體的例子,你可能想要做的是使用普通的舊登錄網址像這樣:如果您在設置中設置TEMPLATE_DEBUG = True

<a href="{% url django.contrib.auth.views.login %}?next={{request.path}}"> 
    log in 
</a> 

而且,我相信,你會在拋出錯誤之前得到django檢查的所有url模式的列表。

+0

謝謝!描述得很好。這基本上是我最終做的,使用auth.REDIRECT_FIELD_NAME代替「下一個」。 但是,TEMPLATE_DEBUG = True沒有顯示任何關於URL模式的更多信息,所以我將這個問題留給公開。 由於我使用Google App Engine和應用程序引擎補丁,因此Django修補得很好,所以我希望看到註冊的實際URL模式,而不僅僅是猜測它。 – dfrankow 2009-10-16 20:09:59

+0

我知道我已經看到在谷歌應用程序引擎中運行的調試頁面,但我只是使用內置的Django而不是應用程序引擎補丁。 – pcardune 2009-10-17 07:30:15

+0

是的,如果你設置了DEBUG = True,那麼你會看到那張圖案的表格,而不是其他的。此刻,我忘記了爲什麼它不總是出現。 – dfrankow 2009-10-18 15:33:29