Django中带Slug的特定URL跳转失效,自动跳转至首页求助
问题分析与解决方案
核心问题:URL路由冲突
你的urls.py中存在两个无前缀的slug捕获路由:
path('<slug>',views.EachQuiz,name='EachQuiz'), # ... path("<slugp>", views.ChangeQuizInfol, name="ChangeQuizInfol"),
Django的URL匹配是从上到下依次匹配,第一个<slug>会捕获所有单段字符串的URL(比如你的correct_slug值),导致ChangeQuizInfol的路由永远不会被触发。如果EachQuiz视图内部有重定向到首页的逻辑,就会出现点击链接后跳转到首页的现象。
解决步骤
1. 修改URL路由,添加前缀区分
给ChangeQuizInfol的路由添加专属前缀(比如change/),避免和其他slug路由冲突:
# urls.py 调整后的内容 urlpatterns = [ # ... 其他路由保持不变 path('<slug>',views.EachQuiz,name='EachQuiz'), # ... 其他路由保持不变 # 给ChangeQuizInfol添加前缀 path("change/<slugp>", views.ChangeQuizInfol, name="ChangeQuizInfol"), ]
2. 更新模板中的URL反向解析
修改lists.html中的链接,匹配新的路由前缀:
<!-- lists.html --> <a href="{% url "komaki:ChangeQuizInfol" slugp=quiz.correct_slug %}">{{quiz.name}}</a>
此时生成的链接会是/komaki/change/[你的slug值],不会再被EachQuiz的路由捕获。
3. 修复视图中的异常处理(可选但推荐)
你的ChangeQuizInfol视图使用了过于宽泛的try-except,会隐藏错误(比如slug不存在时的DoesNotExist异常),建议细化异常处理:
def ChangeQuizInfol(request,slugp): print("changequizinfo is running.") co = {} if request.method == 'POST': print("is post.") form = NewAzmoonForms(request.POST) # 传入POST数据,而非生成空白表单 # 可补充表单验证与保存逻辑 else: try: quiz = QuizStudent.objects.get(slug=slugp) print(quiz) questions = Questions.objects.filter(quiz_id=quiz.id) print(questions) form = NewAzmoonForms() co = {"quiz": quiz, "form": form, "questions": questions} except QuizStudent.DoesNotExist: # 处理slug不存在的情况,比如重定向到列表页 return redirect('komaki:ListsTeacherQuizes') return render(request, "komaki/per.html", co)
4. 验证slug参数正确性
确保quiz.correct_slug的值和QuizStudent模型中slug字段的内容完全匹配,避免因参数错误导致视图无法找到对应对象。
内容的提问来源于stack exchange,提问作者MohammadAminGHS
相关产品推荐
相关产品推荐

