【发布时间】:2016-11-18 07:31:51
【问题描述】:
我有一些代码,当它执行时,它会抛出一个 NoReverseMatch,说:
NoReverseMatch at /my_url/ 为带有参数“()”和关键字参数“{}”的“my_url_name”反向。尝试了 n 个模式:[]
这是什么意思,我能做些什么?
【问题讨论】:
标签: django django-urls
我有一些代码,当它执行时,它会抛出一个 NoReverseMatch,说:
NoReverseMatch at /my_url/ 为带有参数“()”和关键字参数“{}”的“my_url_name”反向。尝试了 n 个模式:[]
这是什么意思,我能做些什么?
【问题讨论】:
标签: django django-urls
NoReverseMatch 错误表示 Django 无法为您在任何已安装应用的 url 中提供的 url 找到匹配的 url 模式。
当根据提供的参数无法识别 URLconf 中的匹配 URL 时,django.core.urlresolvers 会引发 NoReverseMatch 异常。
要开始调试它,您需要首先分析给您的错误消息。
/my_url/ 处的 NoReverseMatch
这是当前正在呈现的 url,这是您的应用程序当前正在尝试访问的 url,但它包含无法匹配的 url
“my_url_name”的反向
这是找不到的网址的名称
带有参数 '()' 和
这些是它提供给 url 的非关键字参数
未找到关键字参数“{}”。
这些是它提供给 url 的关键字参数
尝试了n个模式:[]
这些是它能够在您尝试匹配的 urls.py 文件中找到的模式
首先在您的源代码中找到与当前正在呈现的 url 相关的代码 - url、视图和任何涉及的模板。在大多数情况下,这将是您当前正在开发的代码的一部分。
完成此操作后,按照 django 将遵循的顺序通读代码,直到到达尝试为 my_url_name 构造 URL 的代码行。同样,这可能是在您最近更改的地方。
既然您已经发现了错误发生的位置,请使用错误消息的其他部分来解决问题。
urls.py 中设置了app_name(例如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 等网站快速测试您的模式是否与您认为正在创建的 url 匹配,将 url 模式复制到顶部的正则表达式字段中,然后使用文本区域包含任何您认为应该匹配的网址。
常见错误:
与. 通配符或任何其他正则表达式字符匹配
记得用\前缀转义特定字符
只匹配小写/大写字符
尝试使用a-Z 或\w 代替a-z 或A-Z
检查您匹配的模式是否包含在尝试的模式中
如果它不在这里,那么您可能忘记将您的应用程序包含在 INSTALLED_APPS 设置中(或者可能需要查看 INSTALLED_APPS 中应用程序的顺序)
在 Django 1.10 中,删除了通过 python 路径反转 url 的功能。应改为使用命名路径。
如果您仍然无法找到问题所在,请随时提出一个新问题,包括您尝试过的内容、研究过的内容(您可以链接到此问题),然后包括相关的问题的代码 - 您正在匹配的 url、任何相关的 url 模式、显示 django 尝试匹配的错误消息的部分,以及可能的 INSTALLED_APPS 设置(如果适用)。
【讨论】:
set app_name in the app's urls.py (e.g. app_name = 'my_app') 是重点
并确保您的路线在路线列表中:
./manage.py show_urls | grep path_or_name
【讨论】:
show_urls 不是 Django 功能,这不会回答问题。
参数部分通常是模型中的对象。请记住将其添加到视图中的上下文中。否则模板中对对象的引用将为空,因此与带有 object_id 的 url 不匹配。
【讨论】:
可能是它没有加载您期望的模板。我添加了一个继承自 UpdateView 的新类 - 我认为它会自动从我命名的类中选择模板,但它实际上是根据类上的 model 属性加载它的,这导致了另一个(错误)正在加载的模板。一旦我为新类明确设置了template_name,它就可以正常工作了。
【讨论】: