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

跟随Django教程第5部分时遭遇NoReverseMatch错误求助

解决Django教程第五部分的NoReverseMatch错误

嘿,我跟着Django官方教程第五部分的时候也踩过这个坑!咱们来拆解一下这个问题,一步步搞定它。

错误原因解析

这个NoReverseMatch错误的核心是:模板渲染/polls/页面时,调用{% url 'detail' ... %}标签时传给detail视图的参数是空字符串(('',)),但你的URL模式要求detail必须接收一个数字类型的pk参数(['polls\/(?P<pk>[0-9]+)\/$']),完全匹配不上,所以报错了。

排查和解决步骤

  • 第一步:检查列表模板的URL标签
    打开polls/index.html(渲染/polls/页面的模板),找到指向detail页面的链接代码。官方教程里正确的写法应该是:

    <li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
    

    你要确认几个点:

    • 循环变量是不是question?比如你的循环是不是{% for question in latest_question_list %},别把变量名写错成item或者别的,导致question.id根本不存在。
    • question.id有没有值?可以临时在模板里加个调试输出:{{ question.id }},刷新页面看看是不是空的。如果是空的,说明你的Question对象还没保存到数据库(没有自动生成的id),或者视图传递的列表有问题。
  • 第二步:确认index视图的逻辑
    打开polls/views.py里的index视图,确保它正确查询了Question列表并传递给模板:

    def index(request):
        latest_question_list = Question.objects.order_by('-pub_date')[:5]
        context = {'latest_question_list': latest_question_list}
        return render(request, 'polls/index.html', context)
    

    要保证latest_question_list里的每个Question对象都是已经保存到数据库的(比如你通过后台或者shell创建了测试数据),这样每个对象才有有效的id值。

  • 第三步:核对URLconf的路由配置
    检查polls/urls.py里的detail路由,确认它的name是detail,并且参数是pk:

    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('', views.index, name='index'),
        path('<int:pk>/', views.detail, name='detail'),  # 这里要确保name是'detail',参数是<int:pk>
        # 其他路由...
    ]
    

    因为Django 2.x用path而不是url,所以这个格式要对应上,确保和模板里{% url 'detail' ... %}的name一致。

常见坑点提醒

  • 别把question.id写成question.pk?其实也可以,但前提是你的Question模型的主键是默认的id(也就是pk和id是同一个值),所以这个不是大问题,但要保证变量存在。
  • 如果是刚创建的Question对象,一定要调用save()方法,不然它没有数据库生成的id值,模板里就会传空字符串给url标签。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:59:41