在Django (New)中需要重定向视图的帮助



我贴了一个和这个题目相同的问题,大家可以从这个链接看到

不幸的是,因为这是我第一次提出问题,所以出现了一些格式错误,这个问题暂时关闭了。我已经编辑并重新提交,但我不知道这需要多长时间,所以我不妨做一个新的。

我正在开发一个用于阅读小说的web应用程序,目前我在使用url指导视图的某个部分卡住了。我使用Django作为后端,PostgreSQL作为数据库,HTML与bootstrap作为前端。我将把我的代码贴在下面:

这是我的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(来自app文件夹):

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 .py中的配置,我已经设法从主页转到一个特定的小说索引页,url:localhost:8000/book/book.slug,然后使用url:localhost:8000/book/book.slug/chapter.slug阅读一章,然后我放置一个HTML链接回到索引页,以防我想停止阅读像这样的章节:

<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>

这就是我遇到问题的地方,因为我想到的是,当点击时,链接将再次指向索引页,这是localhost:8000/book/book.slug。但实际发生的是,它显示了一个NoReveseMatch错误在章节页面重新加载。

从查看日志后我可以推断出,应该有一个段符作为视图Book_detail()工作的参数,例如'test'(一个新名称&;test &;的段符)。但相反,参数显示了一个空白'(",")',这使得链接无法指向Book_detail()。

有谁知道我做错了什么吗?任何帮助或建议都很感谢

编辑1:NoReverseMatching错误已经修复,但现在点击url将返回一个DoesNotExist at book/chapter.slug错误,而不是。

编辑2:这个问题已经有答案了,你可以看到下面的答案。

修改为:

<a href="{%url 'book_detail' book.slug %}" class="text-dark">{{detail.book}}</a>/

试试这个

<a href="{%url 'book_detail' book__slug.slug %}" class="text-dark">{{detail`.book}}</a>

关于DoesNotExist的问题已经修复!

我发现通过在views.pydetail()中添加另一个定义,如下所示:

def detail(request, book_slug, chapter_slug):
book = get_object_or_404(Chapter, book__slug = book_slug,slug = chapter_slug)
index = Book.objects.get(slug = book_slug)
title = index.slug
return render(request, 'app/detail.html', {'detail': book, 'title':title})

,然后像这样添加到HTML中:

<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>

我现在可以返回到索引页了!

谢谢大家的帮助和建议。我也意识到,我们犯了很多笨拙的错误,实际上,这些错误并不难解决。只是我忽略了它们。

最新更新