Нужна помощь по перенаправлению представлений в Django (New)

Я разместил вопрос с таким же названием, как и этот, все могут увидеть его по этой ссылке

К сожалению, поскольку это был мой первый раз, были допущены некоторые ошибки формата, и этот вопрос закрыт на данный момент. Я отредактировал его и отправил на открытие снова, но я не знаю, сколько времени это займет, так что я мог бы сделать новый вопрос.

Я работаю над веб-приложением для чтения романов и в настоящее время застрял на определенном этапе в направлении представлений с помощью урлов. Я использую Django в качестве back end с PostgreSQL в качестве базы данных и HTML с bootsrap в качестве front end. Я опубликую свой код ниже:

Вот мой 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})

С помощью конфигураций в urls.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() в качестве аргумента должен был быть slug, например, 'test' (slug для названия романа "Test"). Но вместо этого аргумент показал пустое '('',)', что привело к тому, что ссылка не смогла направить на Book_detail().

Кто-нибудь знает, что я сделал не так? Любая помощь или предложения будут приняты с благодарностью

Измените это на:

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

Спасибо за ответы, я немного изменил код в views.py, где title = Book.slug заменен на title = book.slug, что теперь исправляет ошибку. Но теперь, когда страница главы снова загрузилась правильно, нажатие на url возвращает мне ошибку DoesNotExist at book/chapter.slug, где объясняется, что "Book matching does not exist". Означает ли это, что проблема теперь исходит из models.py вместо него?

Попробуйте это

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

Проблема с DoesNotExist была исправлена !

Я обнаружил это, добавив еще одно определение в views.py в detail(), которое звучит так:

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>

Теперь я могу вернуться на индексную страницу!

Спасибо всем за помощь и предложения. Я также понял, что было сделано много неуклюжих ошибок, которые на самом деле было не так уж сложно решить. Просто я не обратил на них внимания.

Вернуться на верх