You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django视图重定向问题求助(新帖)

Django视图定向与URL反转问题排查

此前在Stack Exchange发布的同名问题因格式问题被关闭,编辑后申请重开等待中,故发布新帖求助。

开发的小说阅读Web应用采用Django+PostgreSQL后端、HTML+Bootstrap前端,目前在URL配置与视图定向环节遇到问题,相关代码及场景如下:

项目根目录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('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'),
]

models.py

from django.db import models

# Create your models here.
class Category(models.Model):
    name = models.CharField(max_length=50)
    slug = models.SlugField(max_length=50, unique=True, blank=True, editable=True)
    def __str__(self):
        return self.name
class Chapter(models.Model):
    chapter = models.Count
    chapter_name = models.CharField(max_length=100)
    book = models.ForeignKey('Book', on_delete=models.CASCADE, null=True, related_name = 'Books')
    detail = models.TextField()
    slug = models.SlugField(max_length=100, unique=True, blank=True, editable=True)
    def __str__(self):
        return self.chapter_name
class Book(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100, unique=True, blank=True, editable=True)
    cover_image = models.ImageField(upload_to= 'images/', blank= True, null = True)
    author = models.CharField(max_length=100)
    summary = models.TextField()
    category = models.ForeignKey('Category', on_delete=models.CASCADE, null = True, related_name = 'books')
    #date = models.DateField(auto_now_add=True)
    recommended_book = models.BooleanField(default=False)
    recommended_book_hot = models.BooleanField(default=False)
    recommended_book_new = models.BooleanField(default=False)
    recommended_book_finish = models.BooleanField(default=False)
    def __str__(self):
        return self.title

views.py

from django.shortcuts import render
from django.http import HttpResponse
from django.http import HttpResponseRedirect
from .forms import RegistrationForm
from .models import Book, Category, Chapter
from gtts import gTTS
from django.urls import reverse
from django.shortcuts import get_object_or_404
# Create your views here.
def home(request):
    recommended_book = Book.objects.filter(recommended_book = True)
    recommended_book_hot = Book.objects.filter(recommended_book_hot = True)
    recommended_book_new = Book.objects.filter(recommended_book_new = True)
    recommended_book_finish = Book.objects.filter(recommended_book_finish = True)
    return render(request, 'app/home.html', {'recommended_book': recommended_book, 'recommended_book_hot': recommended_book_hot, 'recommended_book_new': recommended_book_new, 'recommended_book_finish': recommended_book_finish})
def detail(request, book_slug, chapter_slug):
    book = get_object_or_404(Chapter, book__slug = book_slug,slug = chapter_slug)
    title = book.slug
    return render(request, 'app/detail.html', {'detail': book, 'title':title})
def register(request):
    form = RegistrationForm()
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/')
    return render(request, 'app/register.html', {'form': form})
def category_detail(request, category_slug):
    category = Category.objects.get(slug = category_slug)
    books = Category.objects.prefetch_related('books')
    return render(request, 'app/genre_detail.html', {'category':category})
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})

问题描述

当前URL配置可实现页面跳转路径:主页 → 小说索引页(URL:localhost:8000/book/book.slug)→ 章节页(URL:localhost:8000/book/book.slug/chapter.slug)。

在章节页添加返回小说索引页的面包屑链接:

<div class="container p-2">
    <a href="/ " class="text-dark">Home  </a>/
    <a href="{%url 'book_detail' title%}" class="text-dark">{{detail.book}}</a>/
    <a href="" class="text-dark">{{detail.chapter_name}}</a>
</div>

预期点击链接返回小说索引页,但页面加载时出现NoReverseMatch错误,推断是book_detail视图需传入slug参数,但实际传入空值。

修复该错误后,点击链接又出现DoesNotExist at book/chapter.slug错误,最终问题已解决。


内容的提问来源于Stack Exchange,提问作者Long Đỗ Trần Minh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 21:10:28