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

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

NoReverseMatch at / my_url / Reverse找不到参数'()'和关键字参数'{}'的'my_url_name'。 尝试n个模式:[]

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

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

如果根据提供的参数无法识别URLconf中的匹配URL,则由django.core.urlresolvers引发NoReverseMatchexception。

要开始debugging它,你需要首先检查给你的错误信息。

  • NoReverseMatch at / my_url /

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

  • 反向“my_url_name”

    这是它无法find的url的名称

  • 与参数'()'和

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

  • 未find关键字参数“{}”。

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

  • 尝试n个模式:[]

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

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

一旦你完成了这个工作,按照django将会跟随的顺序读取代码,直到你到达为你的my_url_name构造一个url的代码行。 再次,这可能是你最近改变的地方。

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

url名称

  • 有错别字吗?
  • 你提供了你想要访问给定名称的url吗?
  • 如果你包含了一个名字空间的应用程序(例如include('myapp.urls', namespace='myapp') ,那么你需要在反转时包含名字空间,例如{% url 'myapp:my_url_name' %}或者reverse('myapp:my_url_name')

参数和关键字参数

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

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

如果他们不正确:

  • 该值缺失或一个空string

    这通常意味着您传入的值不包含您所期望的值。 看看你为它分配值,设置断点,你需要弄清楚为什么这个值不能正确传递。

  • 关键字参数有一个错字

    在url模式或者你正在构build的url中纠正这个问题。

如果他们是正确的:

  • debugging正则expression式

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

    常见错误:

    • 匹配反对. 通配符或任何其他正则expression式字符

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

    • 只能匹配低/大写字符

      尝试使用aZ\w而不是azAZ

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

    如果它不在这里,那么你可能忘记在INSTALLED_APPS设置中包含你的应用程序(或者INSTALLED_APPS中的应用程序可能需要查看)

Django版本

在Django 1.10中,通过pythonpath反转url的function已被删除。 应该使用命名的path。


如果你仍然无法find问题,那么随时提出一个新的问题,包括你已经尝试了什么,你已经研究了什么(你可以链接到这个问题),然后包括相关的代码问题 – 你匹配的url,任何相关的url模式,显示django试图匹配的错误消息部分,以及可能的INSTALLED_APPS设置(如果适用的话)。