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


119

我有一些代码,执行时会抛出NoReverseMatch,说:

/ my_url /处的NoReverseMatch与具有参数'()'和关键字参数'{}'的'my_url_name'相反。n个已尝试的模式:[]

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

Answers:


243

NoReverseMatch错误是说,Django中找不到你在任何已安装的应用程序网址提供的URL匹配的URL模式。

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

要开始调试它,您需要先检查给出的错误消息。

  • NoReverseMatch位于/ my_url /

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

  • 反向为“ my_url_name”

    这是它找不到的URL的名称

  • 带参数'()'和

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

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

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

  • n个已尝试的模式:[]

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

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

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

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

网址名称

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

参数和关键字参数

参数和关键字参数用于与给定url中存在的任何捕获组进行匹配,这些捕获组可以由()url模式中的括号括起来。

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

如果它们不正确:

  • 值缺失或字符串为空

    通常,这意味着您传递的值不包含您期望的值。看一下您在何处为其分配值,设置断点,然后需要弄清楚为什么该值无法正确传递。

  • 关键字参数有错字

    在网址格式或您正在构造的网址中更正此问题。

如果它们是正确的:

  • 调试正则表达式

    您可以使用regexr等网站来快速测试您的模式是否与您认为要创建的url相匹配,将url模式复制到顶部的regex字段中,然后使用文本区域包含您认为的所有url。应该匹配。

    常见错误:

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

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

    • 仅匹配小写/大写字符

      尝试使用a-Z\w代替a-zA-Z

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

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

Django版本

在Django 1.10中,删除了通过python路径来反向url的功能。应该改用命名路径。


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


11
最后,我们有一个可以作为
重复

您能否详细说明Django 1.10中的命名路径?
Sage Poudel,

2
是的,重点set app_name in the app's urls.py (e.g. app_name = 'my_app') 在于
CK

我发现此实时正则表达式测试仪更有用:regex101.com
obotezat

感谢您提供有关NoReverseMatch的精湛教程!我能够解决我的问题。
newmachines_xyz

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.