什么是 NoReverseMatch 错误,我该如何解决?

What is a NoReverseMatch error, and how do I fix it?

我有一些代码,当它执行时,它抛出一个 NoReverseMatch,说:

NoReverseMatch at /my_url/ Reverse for 'my_url_name' with arguments '()' and keyword arguments '{}' not found. n pattern(s) tried: []

这是什么意思,我该怎么办?

NoReverseMatch 错误是说 Django 找不到匹配的 url 模式用于您在任何已安装应用程序的 url 中提供的 url。

The NoReverseMatch exception is raised by django.core.urlresolvers when a matching URL in your URLconf cannot be identified based on the parameters supplied.

要开始调试它,您需要先分析给您的错误消息。

  • NoReverseMatch 在 /my_url/

    这是当前正在呈现的 url,您的应用程序当前正在尝试访问的是这个 url,但它包含无法匹配的 url

  • 反向 'my_url_name'

    这是它找不到的 url 的名称

  • 带有参数“()”和

    这些是它提供给 url

    的非关键字参数
  • 未找到关键字参数“{}”。

    这些是它提供给 url

    的关键字参数
  • n 个模式已尝试:[]

    这些是它能够在您的 urls.py 文件中找到的模式,它试图匹配

首先在源代码中找到与当前呈现的 url 相关的代码 - url、视图和涉及的任何模板。在大多数情况下,这将是您当前正在开发的代码的一部分。

完成此操作后,按照 django 将遵循的顺序通读代码,直到到达试图为您的 my_url_name 构建 url 的代码行。同样,这可能是您最近更改过的地方。

既然您已经发现错误发生的位置,请使用错误消息的其他部分来解决问题。

url姓名

  • 有错别字吗?
  • 您是否提供了 url 您正在尝试访问给定名称?
  • 如果您在应用程序的 urls.py(例如 app_name = 'my_app')中设置了 app_name,或者如果您将应用程序包含在命名空间中(例如 include('myapp.urls', namespace='myapp'),那么您需要在反转时包含名称空间,例如 {% url 'myapp:my_url_name' %}reverse('myapp:my_url_name').

参数和关键字参数

参数和关键字参数用于匹配给定 url 中存在的任何捕获组,这些捕获组可以通过 url 模式中周围的 () 括号识别.

假设您要匹配的 url 需要额外的参数,请查看错误消息并首先查看给定参数的值是否正确。

如果不正确:

  • 值缺失或为空字符串

    这通常意味着您传递的值不包含您期望的值。看看你在哪里为它赋值,设置断点,你需要弄清楚为什么这个值没有被正确传递。

  • 关键字参数有错字

    在 url 模式或您正在构建的 url 中更正此问题。

如果正确:

  • 调试正则表达式

    您可以使用 regexr 等网站快速测试您的模式是否与您认为正在创建的 url 匹配,将 url 模式复制到正则表达式字段中顶部,然后使用文本区域包含您认为应该匹配的任何 url。

    常见错误:

    • 匹配 . 通配符或任何其他正则表达式字符

      记得用\前缀转义特定字符

    • 仅匹配 lower/upper 个大小写字符

      尝试使用 a-Z\w 而不是 a-zA-Z

  • 检查您匹配的模式是否包含在尝试的模式中

    如果它不在此处,则可能是您忘记了将您的应用程序包含在 INSTALLED_APPS 设置中(或者可能需要查看 INSTALLED_APPS 中应用程序的顺序)

Django 版本

在 Django 1.10 中,移除了通过 python 路径反转 url 的能力。应改用命名路径。


如果您仍然无法找到问题所在,请随时提出一个新问题,包括您尝试过的内容、您研究过的内容(您可以 link 此问题) ,然后包含问题的相关代码 - 您正在匹配的 url、任何相关的 url 模式、错误消息中显示 django 尝试匹配的内容的部分,以及可能的 INSTALLED_APPS 设置(如果适用)。

使用django-extensions你可以确保你的路线在路线列表中:

./manage.py show_urls | grep path_or_name

如果路由丢失,您可能没有导入应用程序。

它可能没有加载您期望的模板。我添加了一个继承自 UpdateView 的新 class - 我认为它会自动从我命名为 class 的模板中选择模板,但它实际上是根据 model 加载的属性 在 class 上,这导致加载了另一个(错误的)模板。一旦我为新的 class 明确设置 template_name,它工作正常。

参数部分通常是模型中的一个对象。请记住将其添加到视图中的上下文中。否则,对模板中对象的引用将为空,因此不会匹配 url 和 object_id.

一个非常常见的错误是当您得到 with arguments ('',) 时。这是由这样的事情引起的:

{% url 'view-name' does_not_exist %}

由于 does_not_exist 不存在,django 将其计算为空字符串,导致此错误消息。

如果你安装 django-fastdev,你会得到一个很好的崩溃,说 does_not_exist 不存在,这是真正的问题。