我是靠谱客的博主 动人芒果,最近开发中收集的这篇文章主要介绍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 模板页面使用了某个没有判空的对象,但是没有传入导致的。

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

最后

以上就是动人芒果为你收集整理的django.urls.exceptions.NoReverseMatch 的几种情况简述具体情境的全部内容,希望文章能够帮你解决django.urls.exceptions.NoReverseMatch 的几种情况简述具体情境所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部