- 此问题在此处已有答案**:
Need help about redirecting views in Django (New)(3个答案)
2天前关闭。
我是学习Django的初学者,遇到了一个需要大家帮助的问题。
我正在开发一个阅读小说的网络应用程序,遇到了一个与Django中的视图重定向有关的问题,这是关于我如何打开我点击的章节页面并正常阅读,但当我想通过点击链接返回小说索引页面时,遇到了NoReverseMatch错误。我将把代码贴在下面:
This is what I configured in the 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)
Then I created and configured the urls.py like this:
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'),
]
And this is my 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.objects.all()
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)
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})
This is my 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)
books = models.ForeignKey('Book', on_delete=models.CASCADE, null=True, related_name='books')
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.ManyToManyField(Category)
#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
我遇到问题的部分是一个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>
Through the config in urls.py, I can open a novel index page at localhost/book/book.slug
, then read a chapter at localhost/book/book.slug/chapter.slug
. Everything worked normally up to this part. After that, I want to return to the index page by clicking on the link I set at the top corner which back to book/book.slug
again but was met with a NoReveseMatching error.
从错误日志中我可以推断出,我应该有一个参数是'book.slug',如'(book-1,)',用于book_detail()重定向到索引页。但发生的情况是,参数有一个空白'('',)',而不是导致上述错误。
有人知道我做错了什么吗?任何帮助或建议都是感激的
2条答案
按热度按时间nzk0hqpo1#
您需要更正
url
你可以像这样在django html中传递url ...
busg9geu2#
url templatetag以url的名称(即定义路径时传递给
name
参数的值)作为它的第一个参数,如果url路径本身需要参数,那么这些参数就包含在url templatag的名称后面。看起来您正在尝试链接到名为“book_detail”的第一个路径?如果是这种情况,您应该使用
{% url 'book_detail' book.slug %}
。阅读url templatag docs以更好地理解它是如何工作的。
此外,您有两个名称均为“book_detail”的不同路径。路径名称在单个应用程序中应是唯一的。
最后,你应该把你的代码直接放在你的问题的主体中,而不是包括截图。