【问题标题】:What is a NoReverseMatch error, and how do I fix it?什么是 NoReverseMatch 错误,我该如何解决?
【发布时间】:2016-11-18 07:31:51
【问题描述】:

我有一些代码,当它执行时,它会抛出一个 NoReverseMatch,说:

NoReverseMatch at /my_url/ 为带有参数“()”和关键字参数“{}”的“my_url_name”反向。尝试了 n 个模式:[]

这是什么意思,我能做些什么?

【问题讨论】:

    标签: django django-urls


    【解决方案1】:

    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 的代码行。同样,这可能是在您最近更改的地方。

    既然您已经发现了错误发生的位置,请使用错误消息的其他部分来解决问题。

    网址名称

    • 有错别字吗?
    • 您是否提供了尝试访问给定名称的 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-zA-Z

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

      如果它不在这里,那么您可能忘记将您的应用程序包含在 INSTALLED_APPS 设置中(或者可能需要查看 INSTALLED_APPS 中应用程序的顺序)

    Django 版本

    在 Django 1.10 中,删除了通过 python 路径反转 url 的功能。应改为使用命名路径。


    如果您仍然无法找到问题所在,请随时提出一个新问题,包括您尝试过的内容、研究过的内容(您可以链接到此问题),然后包括相关的问题的代码 - 您正在匹配的 url、任何相关的 url 模式、显示 django 尝试匹配的错误消息的部分,以及可能的 INSTALLED_APPS 设置(如果适用)。

    【讨论】:

    • 最后我们有一个规范的答案,我们可以提供作为 dup 目标
    • 您能否详细说明 django 1.10 中的命名路径?
    • 是的,set app_name in the app's urls.py (e.g. app_name = 'my_app') 是重点
    • 我发现这个实时正则表达式测试器更有帮助:regex101.com
    • 感谢您提供关于 NoReverseMatch 的精彩教程!我能够解决我的问题。
    【解决方案2】:

    并确保您的路线在路线列表中:

    ./manage.py show_urls | grep path_or_name
    

    https://github.com/django-extensions/django-extensions

    【讨论】:

    • ﹣1 show_urls 不是 Django 功能,这不会回答问题。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      可能是它没有加载您期望的模板。我添加了一个继承自 UpdateView 的新类 - 我认为它会自动从我命名的类中选择模板,但它实际上是根据类上的 model 属性加载它的,这导致了另一个(错误)正在加载的模板。一旦我为新类明确设置了template_name,它就可以正常工作了。

      【讨论】:

        猜你喜欢
        • 2020-03-30
        • 1970-01-01
        • 2021-12-24
        相关资源
        最近更新 更多