Django视图重定向问题求助:章节页返回小说页触发NoReverseMatch错误
Django NoReverseMatch 问题排查与解决
我是Django初学者,开发小说阅读Web应用时遇到问题:章节页面能正常打开,但点击返回小说详情页的链接时触发NoReverseMatch错误。日志显示book_detail()所需的book.slug参数为空字符串(''),而非预期的类似book-1的有效值。
项目urls.py配置
from django.contrib import admin from django.urls import path, include from django.conf import settings from django.conf.urls.static import static urlpatterns = [ path('admin/', admin.site.urls), path('', include('app.urls')), ] urlpatterns += static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
应用urls.py配置
from django.contrib import admin from django.urls import path, include from django.contrib.auth import views as auth_views from . import views urlpatterns = [ path('', views.home), path('book/<slug:book_slug>/<slug:chapter_slug>/', views.detail, name='detail'), path('genre/<slug:category_slug>', views.category_detail, name='category_detail'), path('book/<slug:book_slug>', views.book_detail, name='book_detail'), path('<slug:book_slug>/', views.book_detail, name='book_detail'), path('register/', views.register, name="register"), path('login/',auth_views.LoginView.as_view(template_name="app/login.html"), name="login"), path('logout/',auth_views.LogoutView.as_view(next_page='/'),name='logout'), ]
views.py相关代码
def detail(request, book_slug, chapter_slug): book = get_object_or_404(Chapter, book__slug = book_slug,slug = chapter_slug) title = Book.objects.all() return render(request, 'app/detail.html', {'detail': book, 'title':title}) def book_detail(request, book_slug): book = Book.objects.get(slug = book_slug) book_category = book.category.first() similar_books = Book.objects.filter(category__name__startswith = book_category) return render(request, 'app/book_detail.html', {'book': book, 'similar_books': similar_books, 'book_category': book_category})
章节页面HTML代码
<div class="bg-white text-gray"> <div class="container p-2"> <a href="/ " class="text-dark">Home </a>/ <a href="{% url 'book_detail' book.slug %}" class="text-dark">{{detail.book}}</a>/ <a href="" class="text-dark">{{detail.chapter_name}}</a> </div> </div>
问题根源与修复方案
模板变量引用错误
章节页面模板中使用了book.slug,但视图传递给模板的上下文变量是detail(对应Chapter实例),正确的变量应该是关联的书籍slug:detail.book.slug。修改模板中的链接代码:<a href="{% url 'book_detail' detail.book.slug %}" class="text-dark">{{detail.book}}</a>/URL路由重复冲突
应用urls.py中存在两条指向book_detail的路由,会导致匹配逻辑混乱,建议保留一条规范路由(统一末尾斜杠格式),删除重复项:# 保留这条规范路由,删除另一条无前缀的路由 path('book/<slug:book_slug>/', views.book_detail, name='book_detail'),视图潜在异常与逻辑错误
book_detail视图中使用Book.objects.get()会在slug不存在时抛出异常,建议替换为get_object_or_404统一错误处理;- 筛选相似书籍时,
book_category是Category实例,直接用于__startswith会出错,需取其name属性:
def book_detail(request, book_slug): book = get_object_or_404(Book, slug=book_slug) book_category = book.category.first() similar_books = Book.objects.filter( category__name__startswith=book_category.name if book_category else '' ) return render(request, 'app/book_detail.html', {'book': book, 'similar_books': similar_books, 'book_category': book_category})
内容的提问来源于stack exchange,提问作者Long Đỗ Trần Minh
相关产品推荐
相关产品推荐

