Django模板渲染报NoReverseMatch错误:无法匹配exam-detail路由
Django NoReverseMatch 错误解决:反向解析'exam-detail'路由失败
错误信息
NoReverseMatch at /user/admin/package/1/ Reverse for 'exam-detail' with arguments '(4,)' not found. 1 pattern(s) tried: ['user/(admin|staff)/exam/(?P<pk>[0-9]+)/$']
问题代码
HTML模板代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> {{object.name}} {{object.price}} {% for exam in object.exams.all %} <p><a href="{% url 'exam-detail' exam.pk %}">{{exam.name}}</a></p> {% endfor %} </body> </html>
原urls.py配置
re_path(r'^(admin|staff)/exam/(?P<pk>[0-9]+)/$',ExamDetail.as_view(),name='exam-detail'),
问题原因
原路由用re_path定义了^(admin|staff)的捕获分组,但模板中使用{% url %}标签时只传递了exam.pk作为参数,没有提供admin或staff这个分组对应的参数。Django反向解析路由时,无法匹配到需要两个参数(分组值和pk)的正则路由,因此抛出NoReverseMatch错误。
解决办法
将路由修改为固定路径的path配置,不再需要额外的分组参数:
path('admin/exam/<int:pk>/',ExamDetail.as_view(),name="exam-detail"),
修改后,反向解析exam-detail路由时只需传递pk参数即可匹配成功,错误也就解决了。
内容的提问来源于stack exchange,提问作者Pexicade
相关产品推荐
相关产品推荐

