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

Say*_*yse 98 django django-urls

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

NoReverseMatch at/my_url/Reverse for'my_url_name',参数'()'和关键字参数'{}'未找到.n模式尝试:[]

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

Say*_*yse 198

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

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

要开始调试它,您需要先解决给您的错误消息.

  • NoReverseMatch at/my_url /

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

  • 反转'my_url_name'

    这是它找不到的网址的名称

  • 带参数'()'和

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

  • 找不到关键字参数"{}".

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

  • n模式尝试:[]

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

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

一旦你完成了这个,按照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需要其他参数,请查看错误消息并首先查看给定参数的值是否正确.

如果他们不正确:

  • 值缺失或为空字符串

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

  • 关键字参数有拼写错误

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

如果他们是正确的:

  • 调试正则表达式

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

    常见错误:

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

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

    • 仅匹配大写/小写字符

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

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

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

Django版本

在Django 1.10中,删除了通过其python路径反转url的功能.应该使用指定的路径.


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

  • 最后,我们有一个规范的答案,我们可以提供作为重复目标 (8认同)
  • 是的,`在应用程序的 urls.py 中设置 app_name(例如 app_name = 'my_app')` 是重点 (3认同)
  • 感谢您提供关于 NoReverseMatch 的精彩教程!我能够解决我的问题。 (2认同)