需要关于Django中重定向视图的帮助[duplicate]

xa9qqrwz  于 2022-12-24  发布在  Go
关注(0)|答案(2)|浏览(144)
    • 此问题在此处已有答案**:

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()重定向到索引页。但发生的情况是,参数有一个空白'('',)',而不是导致上述错误。
有人知道我做错了什么吗?任何帮助或建议都是感激的

nzk0hqpo

nzk0hqpo1#

您需要更正url
你可以像这样在django html中传递url ...

href='{% 'book' book.slug %}'

-------- OR ---------

href='book/book.slug/'
busg9geu

busg9geu2#

url templatetag以url的名称(即定义路径时传递给name参数的值)作为它的第一个参数,如果url路径本身需要参数,那么这些参数就包含在url templatag的名称后面。
看起来您正在尝试链接到名为“book_detail”的第一个路径?如果是这种情况,您应该使用{% url 'book_detail' book.slug %}
阅读url templatag docs以更好地理解它是如何工作的。
此外,您有两个名称均为“book_detail”的不同路径。路径名称在单个应用程序中应是唯一的。
最后,你应该把你的代码直接放在你的问题的主体中,而不是包括截图。

相关问题