如何调试Django NoReverseMatch错误?

时间:2009-10-16 18:04:22

标签: django google-app-engine

伙计们,我收到特定网址调用的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的Google App Engine,因此Django本身已被修改。

1 个答案:

答案 0 :(得分:3)

在这种特殊情况下,url reversal使用视图函数的完整路径,最简单的方法就是查看视图函数。在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中注册。这意味着它可能只是在其他视图中用作辅助函数。

在任何情况下,根据您的特定示例,您可能想要做的是使用普通的旧登录URL,如下所示:

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

此外,我相信如果您在设置中设置TEMPLATE_DEBUG = True,您将获得django在抛出错误之前检查过的所有网址模式的列表。