Django项目404错误:student-notes页面匹配错误URL路由
Django项目404问题解决:student-notes页面被错误匹配到动态路由
问题现象
开发Django项目时,访问http://127.0.0.1:8000/student/student-notes出现404错误,错误提示为**"未找到匹配查询的standard"**,由student.views.SubjectListView触发。Django将该路径错误匹配到<slug:slug>动态路由,而非对应的student-notes固定路由,且错误页面未展示所有URL规则。
核心原因
Django的URL匹配遵循从上到下的顺序优先级,当动态路由(如<slug:slug>)放在固定路由(如student-notes)前面时,student-notes会被当作slug参数传入SubjectListView,而数据库中不存在slug为student-notes的Standard对象,因此抛出404。
解决方案
将所有固定路径的URL规则移动到动态路径规则之前,确保精确匹配优先于模糊匹配。
修改后的urls.py代码
from django.urls import path from student import views from django.contrib.auth.views import LoginView app_name = 'student' urlpatterns = [ path('studentclick', views.studentclick_view), path('studentlogin', LoginView.as_view(template_name='student/studentlogin.html'),name='studentlogin'), path('studentsignup', views.student_signup_view,name='studentsignup'), path('student-dashboard', views.student_dashboard_view,name='student-dashboard'), path('student-exam', views.student_exam_view,name='student-exam'), path('take-exam/<int:pk>', views.take_exam_view,name='take-exam'), path('start-exam/<int:pk>', views.start_exam_view,name='start-exam'), path('calculate-marks', views.calculate_marks_view,name='calculate-marks'), path('view-result', views.view_result_view,name='view-result'), path('check-marks/<int:pk>', views.check_marks_view,name='check-marks'), path('student-marks', views.student_marks_view,name='student-marks'), path('standard-list', views.StandardListView.as_view(), name='standard-list'), #path('',views.StandardListView.as_view(),name='standard_list'), # 固定路径移到动态路径之前 path('student-notes',views.notes, name='student-notes'), path('delete_note/<int:pk>',views.delete_note,name='delete-notes'), path('notes_detail/<int:pk>',views.NotesDetailView.as_view(),name='notes-detail'), path('student-dictionary', views.dictionary, name='student-dictionary'), path('student-books',views.Books, name='student-books'), path('student-todos',views.todo, name='student-todos'), # 动态路径放在后面 path('<slug:slug>', views.SubjectListView.as_view(), name='subject_list'), path('<str:standard>/<slug:slug>/', views.LessonListView.as_view(),name='lesson_list'), path('<str:standard>/<str:slug>/create/',views.LessonCreateView.as_view(), name='lesson_create'), path('<str:standard>/<str:subject>/<slug:slug>/', views.LessonDetailView.as_view(),name='lesson_detail'), path('<str:standard>/<str:subject>/<slug:slug>/update',views.LessonUpdateView.as_view(),name="lesson_update"), path('<str:standard>/<str:subject>/<slug:slug>/delete',views.LessonDeleteView.as_view(),name='lesson_delete'), ]
补充说明
- 错误页面仅显示部分URL规则:因为Django匹配到第一个符合条件的路由后就停止后续匹配,所以错误页面只展示到匹配成功的路由之前的规则。调整顺序后,固定路径会被优先匹配,不会触发动态路由的错误。
- 额外检查:确保
notes视图函数逻辑正常,Notes模型和数据库连接无异常。
原错误信息
页面未找到(404) 未找到匹配查询的standard 请求方法: GET 请求URL: http://127.0.0.1:8000/student/student-notes 触发者: student.views.SubjectListView 使用onlinexam.urls中定义的URLconf,Django按以下顺序尝试了这些URL模式: admin/ teacher/ student/ studentclick student/ studentlogin [name='studentlogin'] student/ studentsignup [name='studentsignup'] student/ student-dashboard [name='student-dashboard'] student/ student-exam [name='student-exam'] student/ take-exam/<int:pk> [name='take-exam'] student/ start-exam/<int:pk> [name='start-exam'] student/ calculate-marks [name='calculate-marks'] student/ view-result [name='view-result'] student/ check-marks/<int:pk> [name='check-marks'] student/ student-marks [name='student-marks'] student/ standard-list [name='standard-list'] student/ <slug:slug> [name='subject_list'] 当前路径student/student-notes匹配了最后一个规则。 你看到此错误是因为设置文件中DEBUG = True。将其改为False,Django会显示标准404页面。
内容的提问来源于stack exchange,提问作者Zenji
相关产品推荐
相关产品推荐

