Django教程中NoReverseMatch错误:参数未被正确传递
嘿,我之前在做Django投票应用教程时也踩过这个一模一样的坑!既然你已经排除了results.html第9行的问题,咱们从这几个方向接着查:
检查所有模板里的
{% url 'detail' ... %}调用:
别只盯着results.html,index.html、detail.html这些模板里可能也有调用detail路由的地方。仔细看每个url标签的参数,是不是都传了有效的question.id,有没有写成question(漏了.id)或者变量名写错(比如把question写成了quest)。验证视图传递给模板的
question对象:
打开对应的视图函数(比如results视图),看看你是怎么获取question的?比如是不是用了Question.objects.filter(...)返回了QuerySet而不是单个对象?或者get()方法抛出了异常导致question是空的?可以在视图里加个print(question.id)看看输出的是不是有效数字,或者直接在模板里加{{ question.id }}打印出来确认值。核对URL配置的正确性:
去polls的urls.py里,确认detail路由的name是不是拼写正确?比如是不是写成了name='detial'(打错字母)?还有路径的规则是不是正确——path('<int:question_id>/', views.detail, name='detail'),确保参数名question_id和视图里的参数一致。排查视图里的reverse调用:
如果你的视图函数里用了reverse('detail', args=(...))来生成URL,检查这里的参数是不是空的。比如是不是在重定向的时候传了question.id但此时question还没保存,id是None?清缓存重启服务器:
有时候Django的模板缓存会搞鬼,你改了模板但服务器还在用旧版本。试试重启Django开发服务器,或者手动清一下浏览器缓存(Ctrl+Shift+R强制刷新)。检查模板上下文变量:
确认在渲染模板时,视图确实把question变量传进去了。比如是不是在render函数里写了{'q': question}但模板里用的是question.id,变量名不匹配?
内容的提问来源于stack exchange,提问作者mbanerjeepalmer

