我有一些代码,当它执行时,它抛出一个NoReverseMatch,说:找不到参数为'()'且保留字参数为'{}'之'my_url_name'的/my_url/ Reverse处的NoReverseMatch。已尝试n个模式:[]这意味着什么,我能做些什么呢?
iq0todco1#
NoReverseMatch错误是说Django找不到与您在任何已安装应用的url中提供的url匹配的url模式。当您的URLconf中的匹配URL无法根据提供的参数识别时,django.core.urlresolvers会引发NoReverseMatch异常。要开始调试它,您需要从解析提供给您的错误消息开始。
NoReverseMatch
这是当前正在呈现的url,您的应用程序当前正在尝试访问此url,但它包含无法匹配的url
这是找不到的url的名称
这些是它提供给url的非关键字参数
这些是它提供给url的关键字参数
这些是它能够在www.example.com文件中找到的模式urls.py,它试图与这些模式进行匹配首先在源代码中找到与当前呈现的url相关的代码--url、视图和任何相关的模板。在大多数情况下,这将是当前开发的代码的一部分。完成后,按照django的顺序阅读代码,直到你看到为my_url_name创建url的代码行,这可能是你最近修改过的地方。现在您已经发现了错误发生的位置,请使用错误消息的其他部分来解决问题。
my_url_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之类的网站快速测试您的模式是否与您认为正在创建的url匹配。将url模式复制到顶部的regex字段中,然后使用文本区域包含您认为应该匹配的任何url。常见错误:
.
请记住使用\前缀转义特定字符
\
请尝试使用a-Z或\w,而不要使用a-z或A-Z
a-Z
\w
a-z
A-Z
如果不在此处,则可能是您忘记在INSTALLED_APPS设置中包含您的应用程序(或者可能需要查看INSTALLED_APPS中应用程序的顺序)Django版本在Django 1.10中,取消了通过python路径反转url的功能,应该使用命名路径。如果你仍然无法找到问题所在,那么你可以问一个新的问题,包括你已经尝试过的,你已经研究过的(你可以链接到这个问题),然后包含问题的相关代码--你要匹配的url,任何相关的url模式,显示django试图匹配什么的错误消息部分,并且如果可应用的话,还可能包括INSTALLED_APPS设置。
INSTALLED_APPS
bwleehnv2#
一个非常常见的错误是当你得到with arguments ('',)时。这是由类似下面的东西引起的:
with arguments ('',)
{% url 'view-name' does_not_exist %}
由于does_not_exist不存在,django将其赋值为空字符串,从而导致此错误消息。如果你安装django-fastdev,你会得到一个很好的崩溃,说does_not_exist不存在,这是真实的的问题。
does_not_exist
scyqe7ek3#
用django-extensions你可以确定你的路线在路线列表中:
./manage.py show_urls | grep path_or_name
如果缺少路由,则可能是您尚未导入应用程序。
hrysbysz4#
可能是它没有加载你期望的模板。我添加了一个继承自UpdateView的新类-我以为它会自动从我命名的类中选择模板,但它实际上是基于类的model属性加载的,这导致加载了另一个(错误的)模板。一旦我为新类显式设置了template_name,它就工作得很好。
UpdateView
model
template_name
tag5nh1u5#
参数部分通常是模型中的一个对象。请记住将其添加到视图中的上下文。否则,模板中对该对象的引用将为空,因此与具有object_id的url不匹配。
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})
6条答案
按热度按时间iq0todco1#
NoReverseMatch
错误是说Django找不到与您在任何已安装应用的url中提供的url匹配的url模式。当您的URLconf中的匹配URL无法根据提供的参数识别时,django.core.urlresolvers会引发NoReverseMatch异常。
要开始调试它,您需要从解析提供给您的错误消息开始。
这是当前正在呈现的url,您的应用程序当前正在尝试访问此url,但它包含无法匹配的url
这是找不到的url的名称
这些是它提供给url的非关键字参数
这些是它提供给url的关键字参数
这些是它能够在www.example.com文件中找到的模式urls.py,它试图与这些模式进行匹配
首先在源代码中找到与当前呈现的url相关的代码--url、视图和任何相关的模板。在大多数情况下,这将是当前开发的代码的一部分。
完成后,按照django的顺序阅读代码,直到你看到为
my_url_name
创建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-z
或A-Z
如果不在此处,则可能是您忘记在
INSTALLED_APPS
设置中包含您的应用程序(或者可能需要查看INSTALLED_APPS
中应用程序的顺序)Django版本
在Django 1.10中,取消了通过python路径反转url的功能,应该使用命名路径。
如果你仍然无法找到问题所在,那么你可以问一个新的问题,包括你已经尝试过的,你已经研究过的(你可以链接到这个问题),然后包含问题的相关代码--你要匹配的url,任何相关的url模式,显示django试图匹配什么的错误消息部分,并且如果可应用的话,还可能包括
INSTALLED_APPS
设置。bwleehnv2#
一个非常常见的错误是当你得到
with arguments ('',)
时。这是由类似下面的东西引起的:由于
does_not_exist
不存在,django将其赋值为空字符串,从而导致此错误消息。如果你安装django-fastdev,你会得到一个很好的崩溃,说
does_not_exist
不存在,这是真实的的问题。scyqe7ek3#
用django-extensions你可以确定你的路线在路线列表中:
如果缺少路由,则可能是您尚未导入应用程序。
hrysbysz4#
可能是它没有加载你期望的模板。我添加了一个继承自
UpdateView
的新类-我以为它会自动从我命名的类中选择模板,但它实际上是基于类的model
属性加载的,这导致加载了另一个(错误的)模板。一旦我为新类显式设置了template_name
,它就工作得很好。tag5nh1u5#
参数部分通常是模型中的一个对象。请记住将其添加到视图中的上下文。否则,模板中对该对象的引用将为空,因此与具有object_id的url不匹配。
s4chpxco6#
注意reverse()和redirect()之间传递的不同参数,例如:
将与以下产品配合使用:
以及:
但不与以下对象关联:
以及: