【问题标题】:How to debug Django NoReverseMatch errors?如何调试 Django NoReverseMatch 错误?
【发布时间】:2009-10-16 18:04:22
【问题描述】:

伙计们,我收到一个针对特定 url 调用的 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 本身被修改了。

【问题讨论】:

    标签: django google-app-engine


    【解决方案1】:

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

    无论如何,根据您的特定示例,您可能想要做的是使用普通的旧登录网址,如下所示:

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

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

    【讨论】:

    • 谢谢!描述得很好。这基本上就是我最终做的事情,使用 auth.REDIRECT_FIELD_NAME 代替“下一个”。但是,TEMPLATE_DEBUG=True 没有显示有关 URL 模式的任何进一步信息,因此我将这个问题留待解决。由于我使用的是带有应用引擎补丁的 Google App Engine,因此 Django 已经打了相当多的补丁,所以我想查看注册的实际 URL 模式,而不仅仅是猜测。
    • 我知道我也看到了在谷歌应用引擎中运行的调试页面,但我只是使用内置的 django 而不是应用引擎补丁。
    • 是的,如果您设置 DEBUG=True,您有时会看到该模式表,而其他时候则看不到。目前我忘记了为什么它并不总是出现。
    猜你喜欢
    • 2015-10-24
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 2021-08-04
    • 2021-06-14
    相关资源
    最近更新 更多