什么是 NoReverseMatch 错误,我该如何解决?
What is a NoReverseMatch error, and how do I fix it?
我有一些代码,当它执行时,它抛出一个 NoReverseMatch,说:
NoReverseMatch at /my_url/ Reverse for 'my_url_name' with arguments '()' and keyword arguments '{}' not found. n pattern(s) tried: []
这是什么意思,我该怎么办?
NoReverseMatch
错误是说 Django 找不到匹配的 url 模式用于您在任何已安装应用程序的 url 中提供的 url。
The NoReverseMatch exception is raised by django.core.urlresolvers when a matching URL in your URLconf cannot be identified based on the parameters supplied.
要开始调试它,您需要先分析给您的错误消息。
NoReverseMatch 在 /my_url/
这是当前正在呈现的 url,您的应用程序当前正在尝试访问的是这个 url,但它包含无法匹配的 url
反向 'my_url_name'
这是它找不到的 url 的名称
带有参数“()”和
这些是它提供给 url
的非关键字参数
未找到关键字参数“{}”。
这些是它提供给 url
的关键字参数
n 个模式已尝试:[]
这些是它能够在您的 urls.py 文件中找到的模式,它试图匹配
首先在源代码中找到与当前呈现的 url 相关的代码 - url、视图和涉及的任何模板。在大多数情况下,这将是您当前正在开发的代码的一部分。
完成此操作后,按照 django 将遵循的顺序通读代码,直到到达试图为您的 my_url_name
构建 url 的代码行。同样,这可能是您最近更改过的地方。
既然您已经发现错误发生的位置,请使用错误消息的其他部分来解决问题。
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 等网站快速测试您的模式是否与您认为正在创建的 url 匹配,将 url 模式复制到正则表达式字段中顶部,然后使用文本区域包含您认为应该匹配的任何 url。
常见错误:
匹配 .
通配符或任何其他正则表达式字符
记得用\
前缀转义特定字符
仅匹配 lower/upper 个大小写字符
尝试使用 a-Z
或 \w
而不是 a-z
或 A-Z
检查您匹配的模式是否包含在尝试的模式中
如果它不在此处,则可能是您忘记了将您的应用程序包含在 INSTALLED_APPS
设置中(或者可能需要查看 INSTALLED_APPS
中应用程序的顺序)
Django 版本
在 Django 1.10 中,移除了通过 python 路径反转 url 的能力。应改用命名路径。
如果您仍然无法找到问题所在,请随时提出一个新问题,包括您尝试过的内容、您研究过的内容(您可以 link 此问题) ,然后包含问题的相关代码 - 您正在匹配的 url、任何相关的 url 模式、错误消息中显示 django 尝试匹配的内容的部分,以及可能的 INSTALLED_APPS
设置(如果适用)。
使用django-extensions你可以确保你的路线在路线列表中:
./manage.py show_urls | grep path_or_name
如果路由丢失,您可能没有导入应用程序。
它可能没有加载您期望的模板。我添加了一个继承自 UpdateView
的新 class - 我认为它会自动从我命名为 class 的模板中选择模板,但它实际上是根据 model
加载的属性 在 class 上,这导致加载了另一个(错误的)模板。一旦我为新的 class 明确设置 template_name
,它工作正常。
参数部分通常是模型中的一个对象。请记住将其添加到视图中的上下文中。否则,对模板中对象的引用将为空,因此不会匹配 url 和 object_id.
一个非常常见的错误是当您得到 with arguments ('',)
时。这是由这样的事情引起的:
{% url 'view-name' does_not_exist %}
由于 does_not_exist
不存在,django 将其计算为空字符串,导致此错误消息。
如果你安装 django-fastdev,你会得到一个很好的崩溃,说 does_not_exist
不存在,这是真正的问题。
我有一些代码,当它执行时,它抛出一个 NoReverseMatch,说:
NoReverseMatch at /my_url/ Reverse for 'my_url_name' with arguments '()' and keyword arguments '{}' not found. n pattern(s) tried: []
这是什么意思,我该怎么办?
NoReverseMatch
错误是说 Django 找不到匹配的 url 模式用于您在任何已安装应用程序的 url 中提供的 url。
The NoReverseMatch exception is raised by django.core.urlresolvers when a matching URL in your URLconf cannot be identified based on the parameters supplied.
要开始调试它,您需要先分析给您的错误消息。
NoReverseMatch 在 /my_url/
这是当前正在呈现的 url,您的应用程序当前正在尝试访问的是这个 url,但它包含无法匹配的 url
反向 'my_url_name'
这是它找不到的 url 的名称
带有参数“()”和
这些是它提供给 url
的非关键字参数未找到关键字参数“{}”。
这些是它提供给 url
的关键字参数n 个模式已尝试:[]
这些是它能够在您的 urls.py 文件中找到的模式,它试图匹配
首先在源代码中找到与当前呈现的 url 相关的代码 - url、视图和涉及的任何模板。在大多数情况下,这将是您当前正在开发的代码的一部分。
完成此操作后,按照 django 将遵循的顺序通读代码,直到到达试图为您的 my_url_name
构建 url 的代码行。同样,这可能是您最近更改过的地方。
既然您已经发现错误发生的位置,请使用错误消息的其他部分来解决问题。
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 等网站快速测试您的模式是否与您认为正在创建的 url 匹配,将 url 模式复制到正则表达式字段中顶部,然后使用文本区域包含您认为应该匹配的任何 url。
常见错误:
匹配
.
通配符或任何其他正则表达式字符记得用
\
前缀转义特定字符仅匹配 lower/upper 个大小写字符
尝试使用
a-Z
或\w
而不是a-z
或A-Z
检查您匹配的模式是否包含在尝试的模式中
如果它不在此处,则可能是您忘记了将您的应用程序包含在
INSTALLED_APPS
设置中(或者可能需要查看INSTALLED_APPS
中应用程序的顺序)
Django 版本
在 Django 1.10 中,移除了通过 python 路径反转 url 的能力。应改用命名路径。
如果您仍然无法找到问题所在,请随时提出一个新问题,包括您尝试过的内容、您研究过的内容(您可以 link 此问题) ,然后包含问题的相关代码 - 您正在匹配的 url、任何相关的 url 模式、错误消息中显示 django 尝试匹配的内容的部分,以及可能的 INSTALLED_APPS
设置(如果适用)。
使用django-extensions你可以确保你的路线在路线列表中:
./manage.py show_urls | grep path_or_name
如果路由丢失,您可能没有导入应用程序。
它可能没有加载您期望的模板。我添加了一个继承自 UpdateView
的新 class - 我认为它会自动从我命名为 class 的模板中选择模板,但它实际上是根据 model
加载的属性 在 class 上,这导致加载了另一个(错误的)模板。一旦我为新的 class 明确设置 template_name
,它工作正常。
参数部分通常是模型中的一个对象。请记住将其添加到视图中的上下文中。否则,对模板中对象的引用将为空,因此不会匹配 url 和 object_id.
一个非常常见的错误是当您得到 with arguments ('',)
时。这是由这样的事情引起的:
{% url 'view-name' does_not_exist %}
由于 does_not_exist
不存在,django 将其计算为空字符串,导致此错误消息。
如果你安装 django-fastdev,你会得到一个很好的崩溃,说 does_not_exist
不存在,这是真正的问题。