You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django访问/polls/top/出现NoReverseMatch:为何无法使用<int:pk>?

问题根源与解决步骤

首先得给你点破核心问题:你用错了路径转换器的语法环境!

你当前在urls.py里用的是Django旧版的url()函数,但<int:pk>这种带尖括号的路径转换器,是Django 2.0之后推出的path()函数专属语法,两者完全不兼容,这就是你触发NoReverseMatch错误的根本原因。

接下来一步步给你修正:

1. 修正路由配置

有两种可选方案,推荐用第二种(主流写法):

方案一:继续使用url()函数(正则表达式写法)

如果不想换用path(),就得用正则表达式来捕获pk参数,把detail的路由改成这样:

from django.conf.urls import url
from . import views

urlpatterns=[
    url(r'^top/', views.top, name='top'),
    # 用正则命名分组捕获数字类型的pk
    url(r'^detail/(?P<pk>\d+)/$', views.detail, name='detail'),
]

这里的(?P<pk>\d+)是正则的命名分组,意思是捕获一串数字,命名为pk,传给视图函数。

方案二:改用path()函数(推荐)

现在Django官方更推荐用path()/re_path()来写路由,先导入path,然后用<int:pk>的语法:

from django.urls import path
from . import views

urlpatterns=[
    path('top/', views.top, name='top'),
    # 用<int:pk>匹配数字类型的pk参数
    path('detail/<int:pk>/', views.detail, name='detail'),
]

2. 修正detail视图函数

你现在的detail视图没有接收pk参数,就算路由传了pk也拿不到对应的数据,得改成这样:

from django.shortcuts import render, get_object_or_404
from .models import Polls

def top(request):
    data = Polls.objects.order_by('-created_at')
    return render(request,'index.html',{'data':data})

def detail(request, pk):
    # 用get_object_or_404避免pk不存在时抛出服务器错误
    data = get_object_or_404(Polls, pk=pk)
    return render(request,'detail.html',{'data':data})

3. 解释为什么访问/polls/top/会报错

大概率是你在index.html模板里用了类似{% url 'detail' pk=item.pk %}的反向解析代码,但当时你的detail路由没有正确配置pk参数,导致Django找不到对应的路由匹配规则,所以加载top页面时触发了NoReverseMatch错误。把上面的路由和视图都修正后,反向解析就能正常工作了。

内容的提问来源于stack exchange,提问作者user9341676

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:35:53