Django访问/polls/top/时出现NoReverseMatch错误的原因排查
先帮你拆解下这个错误信息,一目了然:
NoReverseMatch at /polls/top/ Reverse for 'detail' with arguments '(1,)' not found. 1 pattern(s) tried: [ 'polls/top/int:pk/' ]
简单说:Django在尝试生成名为detail的URL、并传入参数1时,找不到对应的路由规则,它只找到了polls/top/<int:pk>/这条路径,但这条路径和detail视图不匹配。
下面是具体的问题点和修复方向:
1. 路由的name和视图对应错了
从错误里的尝试路径来看,你子应用的urls.py里肯定有一条路由写错了——大概率是把top相关的路由命名成了detail,或者把detail视图的路径设成了top/<int:pk>/。比如可能是这样:
# 错误的路由配置 path('top/<int:pk>/', views.top, name='detail')
这就导致Django找detail时,定位到了这条属于top的路由,但top视图根本不接收pk参数,自然匹配失败。
正确的做法是给detail视图单独配置路由,并且设置正确的name:
# 子应用urls.py 正确示例 from django.urls import path from . import views urlpatterns = [ path('top/', views.top, name='top'), path('<int:pk>/', views.detail, name='detail'), # 给detail视图配置带pk的路由,name设为detail ]
2. detail视图没接收pk参数
你的detail视图现在是这么写的:
def detail(request): data = Polls.objects.order_by('-created_at') return render(request,'detail.html',{'data':data})
但反向解析时你传了pk=1,说明这个视图应该用来展示单条Polls数据,而不是所有数据。必须修改视图,让它接收pk参数:
def detail(request, pk): # 推荐用get_object_or_404处理不存在的情况,避免报错 from django.shortcuts import get_object_or_404 data = get_object_or_404(Polls, pk=pk) return render(request,'detail.html',{'data':data})
3. 模板里的反向解析调用要对应
如果你在index.html里写了类似{% url 'detail' poll.id %},那必须确保路由里有名为detail、且接受int:pk参数的规则,否则就会触发这个错误。检查模板里的反向解析名称和路由的name完全一致,参数也匹配。
总的来说,就是路由name、视图参数、模板反向解析这三者没对齐,把这三个部分对应上,错误就解决了。
内容的提问来源于stack exchange,提问作者user9341676

