2009-10-16 171 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