django 什么是NoReverseMatch错误,如何修复?

kb5ga3dv  于 2022-11-18  发布在  Go
关注(0)|答案(6)|浏览(155)

我有一些代码,当它执行时,它抛出一个NoReverseMatch,说:
找不到参数为'()'且保留字参数为'{}'之'my_url_name'的/my_url/ Reverse处的NoReverseMatch。已尝试n个模式:[]
这意味着什么,我能做些什么呢?

iq0todco

iq0todco1#

NoReverseMatch错误是说Django找不到与您在任何已安装应用的url中提供的url匹配的url模式。
当您的URLconf中的匹配URL无法根据提供的参数识别时,django.core.urlresolvers会引发NoReverseMatch异常。
要开始调试它,您需要从解析提供给您的错误消息开始。

  • 在/my_url/处无反向匹配

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

  • 反转'my_url_name'

这是找不到的url的名称

  • 使用参数'()'和

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

  • 找不到关键字参数“{}”。

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

  • 已尝试n个模式:[]

这些是它能够在www.example.com文件中找到的模式urls.py,它试图与这些模式进行匹配
首先在源代码中找到与当前呈现的url相关的代码--url、视图和任何相关的模板。在大多数情况下,这将是当前开发的代码的一部分。
完成后,按照django的顺序阅读代码,直到你看到为my_url_name创建url的代码行,这可能是你最近修改过的地方。
现在您已经发现了错误发生的位置,请使用错误消息的其他部分来解决问题。

URL名称

  • 是否有任何打字错误?
  • 您是否提供了要访问给定名称的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模式复制到顶部的regex字段中,然后使用文本区域包含您认为应该匹配的任何url。
常见错误:

  • 比对.万用字符或任何其他正则表达式字符

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

  • 仅匹配小写/大写字符

请尝试使用a-Z\w,而不要使用a-zA-Z

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

如果不在此处,则可能是您忘记在INSTALLED_APPS设置中包含您的应用程序(或者可能需要查看INSTALLED_APPS中应用程序的顺序)
Django版本
在Django 1.10中,取消了通过python路径反转url的功能,应该使用命名路径。
如果你仍然无法找到问题所在,那么你可以问一个新的问题,包括你已经尝试过的,你已经研究过的(你可以链接到这个问题),然后包含问题的相关代码--你要匹配的url,任何相关的url模式,显示django试图匹配什么的错误消息部分,并且如果可应用的话,还可能包括INSTALLED_APPS设置。

bwleehnv

bwleehnv2#

一个非常常见的错误是当你得到with arguments ('',)时。这是由类似下面的东西引起的:

{% url 'view-name' does_not_exist %}

由于does_not_exist不存在,django将其赋值为空字符串,从而导致此错误消息。
如果你安装django-fastdev,你会得到一个很好的崩溃,说does_not_exist不存在,这是真实的的问题。

scyqe7ek

scyqe7ek3#

django-extensions你可以确定你的路线在路线列表中:

./manage.py show_urls | grep path_or_name

如果缺少路由,则可能是您尚未导入应用程序。

hrysbysz

hrysbysz4#

可能是它没有加载你期望的模板。我添加了一个继承自UpdateView的新类-我以为它会自动从我命名的类中选择模板,但它实际上是基于类的model属性加载的,这导致加载了另一个(错误的)模板。一旦我为新类显式设置了template_name,它就工作得很好。

tag5nh1u

tag5nh1u5#

参数部分通常是模型中的一个对象。请记住将其添加到视图中的上下文。否则,模板中对该对象的引用将为空,因此与具有object_id的url不匹配。

s4chpxco

s4chpxco6#

注意reverse()和redirect()之间传递的不同参数,例如:

url(r"^some_app/(?P<some_id>\d+)/$", some_view_function, name="some_view")

将与以下产品配合使用:

reverse("some_view", kwargs={"some_id": my_id})

以及:

redirect("some_view", some_id=my_id)

但不与以下对象关联:

reverse("some_view", some_id=my_id)

以及:

redirect("some_view", kwargs={"some_id": my_id})

相关问题