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

时间:2016-07-15 07:22:59

标签: django django-urls

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

  

/ my_url的NoReverseMatch /反向'my_url_name',参数'()'和关键字参数'{}'未找到。 n模式尝试:[]

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

4 个答案:

答案 0 :(得分:173)

NoReverseMatch错误表示Django无法为您已安装的任何应用网址中提供的网址找到匹配的网址格式。

  

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

要开始调试,您需要先处理提供给您的错误消息。

  • / my_url /

    的NoReverseMatch

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

  • 反转' my_url_name'

    这是找不到的网址名称

  • 带参数'()'和

    这些是提供给网址的非关键字参数

  • 关键字参数' {}'未找到。

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

  • 尝试了一些模式:[]

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

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

完成此操作后,请按照django将遵循的顺序阅读代码,直到您到达尝试为my_url_name构建网址的代码行。同样,这可能是你最近改变的地方。

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

网址名称

  • 有拼写错误吗?
  • 您是否提供了您尝试访问指定姓名的网址?
  • 如果您在应用的urls.py中设置了app_name(例如app_name = 'my_app'),或者您在应用中添加了命名空间(例如include('myapp.urls', namespace='myapp')),那么您需要包含倒退时的命名空间,例如{% url 'myapp:my_url_name' %}reverse('myapp:my_url_name')

参数和关键字参数

参数和关键字参数用于匹配给定网址中存在的任何捕获组,这些捕获组可以通过网址格式中的周围()括号进行标识。

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

如果他们不正确:

  • 缺少值或空字符串

    这通常意味着您传入的值并不包含您期望的值。看看你为它指定值,设置断点,你需要弄清楚为什么这个值没有正确通过。

  • 关键字参数有拼写错误

    在网址模式或您正在构建的网址中更正此内容。

如果他们是正确的:

  • 调试正则表达式

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

    常见错误:

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

      请记住使用\前缀

    • 转义特定字符
    • 仅匹配大写/小写字符

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

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

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

Django版本

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

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

答案 1 :(得分:0)

并确保您的路线在路线列表中:

./manage.py show_urls | grep path_or_name

https://github.com/django-extensions/django-extensions

答案 2 :(得分:0)

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

答案 3 :(得分:-4)

您看到此错误,因为您使用的django版本低于django 1.11。尝试更新django版本,将修复错误。

使用:

pip install --upgrade django==1.11

参考文献: https://docs.djangoproject.com/en/2.0/releases/1.11/#whats-new-1-11