我有一些代码,当它执行时,会抛出一个NoReverseMatch,说:
/ my_url的NoReverseMatch /反向'my_url_name',参数'()'和关键字参数'{}'未找到。 n模式尝试:[]
这是什么意思,我能做些什么呢?
答案 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-z
或A-Z
检查您匹配的模式是否包含在尝试的模式中
如果它不在这里,那么您可能忘记在INSTALLED_APPS
设置中包含您的应用(或INSTALLED_APPS
内的应用排序可能需要查看)
在Django 1.10中,删除了通过其python路径反转url的功能。应该使用指定的路径。
如果您仍然无法追查问题,请随时提出一个新问题,其中包括您尝试过的内容,您已经研究过的内容(您可以链接到此问题) ,然后在问题中包含相关代码 - 您要匹配的网址,任何相关的网址格式,错误消息中显示django尝试匹配的部分,以及可能的INSTALLED_APPS
设置适用。
答案 1 :(得分:0)
并确保您的路线在路线列表中:
./manage.py show_urls | grep path_or_name
答案 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