django.urls.exceptions.NoReverseMatch 的几种情况

简述

近期在写Django模块时,又碰到这个问题,花了些时间解决,这里汇总一下,最近这次异常出现后的分析思路。

具体情境

在测试用例报错

在测试用例中,解析地址时,下面的错误:

django.urls.exceptions.NoReverseMatch

其他的报错信息,都是说视图函数不对。
然后检查,发现是解析路径时有问题,我将reverse, resolve用混了。

reverse 是用来解析url的
resolve 是用来解析视图的

发现方式:这次是通过测试用例发现的。

解决办法:改正后就没有报错了。

小结:这种就需要仔细回忆近期有没有调用这两个方法解析地址,有的话建议检查一下是否有误。

模板页面取值时报错

空模型对象调用属性,报错:

django.urls.exceptions.NoReverseMatch: Reverse for 'topic_posts' with arguments '(3, '')' not found.

发现方式:这次是通过在模板的获取对象的地方设置断点,调试发现的。

解决办法:使用对象前判空

小结:需注意避免空指针,使用前判空以及对不确定的数据处理很重要。

模板中设置的跳转链接少了对象参数

正常使用没有任何问题,后面添加了类视图后,发现有个正常的地址解析不了了:

NoReverseMatch at /weekly/1/task/1/update
Reverse for 'weekly_preview' with keyword arguments '{'pk': ''}' not found. 1 pattern(s) tried: ['weekly/(?P<pk>[0-9]+)/preview/$']

分析:这一看就是少了参数,但是我没使用类视图时没有一点问题的地址,突然就不能反向解析了。

目前发现,将模板中,指向这个的链接给注释掉,就初步解决了这个问题,这样就不能共用了,这不是根本的办法。

进一步分析,可能是update 页面没有获取到weekly这个对象,这点可以从update页面显示结果看出来,然后设置断点调试一下,发现确实如此。

所以解决思路就是如何找到丢失的weekly,获取如何将weekly对象添加到update视图中

顺藤摸瓜,发现在update视图中,使用的model对象是Task,在编辑页面使用的是weekly,这就是问题所在

所以我这里的解决办法:
方案一:将这个链接按钮放其他页面
方案二:将update视图的model改为weekly
方案三:在update视图中,加入判断,如果没有weekly就不显示链接按钮,也就是第二种场景的使用前判空

小结:发现这种情况很多原因,主要就是少了参数,或者使用了空的对象。所以需要仔细检查与报错页面有关的模板内的链接,有关的视图函数是否少了参数。

读者可以尝试解决一下下面这个链接的问题,因为无法在这个网页注册,所以无法提供帮助:

https://www.cnpython.com/qa/110998#

我的分析结果是,他视图的edit函数,在GET请求时,返回的路径少了pk导致的:

    else:
        return render(request, 'pages/plan_edit.html', {'pk': post.pk})

或者他的plan_edit.html 模板页面使用了某个没有判空的对象,但是没有传入导致的。

记录一下,以后方便分析。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
这个错误通常表示 Django 在尝试使用给定的参数来反向解析 URL 时失败了。在这个特定的错误中,它告诉我们 Django 尝试使用参数 `(None,)` 来解析名为 `deleteuser` 的 URL,但未能找到匹配的 URL 模式。 这可能是由于多种原因引起的,其中一些可能包括: 1. 你没有正确地定义 URL 模式。请确保在 URLconf 文件中正确地定义了名为 `deleteuser` 的 URL 模式,并且该模式与视图函数匹配。 2. 你在使用 `reverse` 或 `{% url %}` 模板标签时,未正确地传递参数。请确保你传递了正确的参数,并且它们与 URL 模式中的参数匹配。 3. 你可能在模板中尝试使用 `{% url %}` 标签来生成 URL,而没有为模板上下文提供必要的参数。请确保你在使用 `{% url %}` 标签时,为其提供了必要的参数。 4. 如果你使用了命名空间,请确保你正确地指定了命名空间和 URL 名称。命名空间和 URL 名称组合起来唯一标识一个 URL 模式。 根据你的错误信息,我们可以看到参数 `(None,)` 被传递给了 `deleteuser` 视图函数。这可能是由于 `user.id` 为空导致的。请确保在调用 `disp_confirm()` 函数之前,已经正确地设置了 `user.id` 变量。你可以在模板中添加一个条件语句来检查 `user.id` 是否为空,以避免这个错误: ``` {% if user.id %} <button onclick="disp_confirm()">删除用户</button> {% endif %} ``` 如果 `user.id` 为空,则不会显示删除按钮。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值