什么是 NoOverseMatch 错误,我如何修复它?

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

对于‘ my _ url _ name’,使用参数’()’和关键字参数’{}’进行反向匹配

这是什么意思,我能做什么?

197030 次浏览

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

当无法根据提供的参数识别 URLconf 中匹配的 URL 时,django.core.urlResolvers 会引发 NoVERseMatch 异常。

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

  • NoOverseMatch at/my _ url/

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

  • 返回“ my _ url _ name”

    这是它找不到的 url 的名称

  • 与参数’()’和

    这些是它提供给 url 的非关键字参数

  • 找不到关键字参数“{}”。

    这些是它提供给 url 的关键字参数

  • N 句型: []

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

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

完成这一步之后,按照 django 所遵循的顺序阅读代码,直到找到试图为 my_url_name构造 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这样的网站来快速测试你的模式是否匹配你认为你正在创建的网址,将网址模式复制到顶部的正则表达式字段中,然后使用文本区域来包含任何你认为应该匹配的网址。

    常见误区:

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

      请记住使用 \前缀转义特定字符

    • 只匹配小写/大写字符

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

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

    如果它不在这里,那么它的可能性是,你已经忘记把你的应用程序包括在 INSTALLED_APPS设置(或在 INSTALLED_APPS中的应用程序的顺序可能需要看看)

姜戈版本

在 Django 1.10中,删除了通过 Python 路径反转 URL 的能力。应改为使用命名路径。


如果你仍然无法跟踪问题,那么请随意提出一个新的问题,包括你已经尝试了什么,你已经研究了什么(你可以链接到这个问题) ,然后包括与问题相关的代码-你正在匹配的网址,任何相关的网址模式,显示 django 试图匹配的错误信息的部分,可能的话还有 INSTALLED_APPS设置。

使用 姜戈接发,你可以在路线列表中确定你的路线:

./manage.py show_urls | grep path_or_name

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

这可能是因为它没有加载您期望的模板。我添加了一个继承自 UpdateView的新类——我以为它会自动从我命名的类中选择模板,但实际上它是基于类的 model属性加载的,这导致了另一个(错误的)模板被加载。一旦我为新类显式设置了 template_name,它就可以正常工作了。

参数部分通常是来自模型的对象。记住将它添加到视图中的上下文中。否则,对模板中对象的引用将为空,因此不会将 url 与 object _ id 匹配。

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

{% url 'view-name' does_not_exist %}

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

如果你安装 Django-fast dev,你会得到一个不错的崩溃说 does_not_exist不存在,这是真正的问题。

注意在 return ()和 redirect ()之间传递的不同参数,例如:

url(r"^some_app/(?P<some_id>\d+)/$", some_view_function, name="some_view")

将与以下人士合作:

reverse("some_view", kwargs={"some_id": my_id})

以及:

redirect("some_view", some_id=my_id)

但不是:

reverse("some_view", some_id=my_id)

以及:

redirect("some_view", kwargs={"some_id": my_id})