基于Django类的视图相关字段映射u

2024-04-18 02:51:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难让一个小说网页返回一个特定书籍的适当章节的视图。我的索引页列出了Book model类的所有对象,并用slug字段将它们超链接到detail页面。在

<li><a href="{% url 'bible:detail' book.slug %}">{{ book.name }}</a></li>

这应该叫我详细信息.html带有slug参数的页面(右??)。detail视图与Chapter model类一起工作,后者链接到具有外键(id number)的Book model类。我意识到Chapter model类本身没有slug字段,但是我认为它应该能够通过与book模型的关系映射url。这是错误的假设吗?我知道我可以将slug字段添加到章节模型中,但这似乎是多余的,因为应用程序是一个翻译器,我最终会为每个章节中的句子创建一个模型类。我怎么才能让它工作? 我不知道我的方法是否正确,但我得到的错误是:

^{pr2}$

该模型由两个类(Book和Chapter)组成,它们通过外键(in Book)链接起来。图书索引页列出了图书馆中的每一本书以及它们的章节索引页的超链接。图书索引页工作良好,但我似乎不能正确地将参数传递到章节视图并显示章节索引页面(只需列出章节编号,稍后我还会超链接)。代码有点像科学怪人,如果有什么是不必要的,或者如果有更简单的方法,请告诉我。非常感谢任何帮助

在模型.py在

from django.db import models
from django.template.defaultfilters import slugify

class Book(models.Model):
    number = models.PositiveIntegerField(primary_key=True, unique=True, db_index=True)
    name = models.CharField(max_length=33, db_index=True)
    short = models.CharField(max_length=7)
    search = models.CharField(max_length=7)
    chaptercount = models.IntegerField()
    title = models.CharField(max_length=33)
    slug = models.SlugField(max_length=33, verbose_name=('Book Slug'), default=name)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super(Book, self).save(*args, **kwargs)

    def __str__(self):
        return self.name

    class Meta:
        ordering = ['number',]

class Chapter(models.Model):
    book = models.ForeignKey(Book, related_name='chapters', on_delete=models.CASCADE)
    number = models.PositiveIntegerField(db_index=True)

    def __str__(self):
        return '%s %s' % (self.book.slug, self.number)

    def get_absolute_url(self):
        return ('chapter_detail', [self.book.slug, self.number])

    class Meta:
        ordering = ['number',]
        unique_together=(('book','number',),)

在网址.py在

from django.urls import path
from django.conf.urls import url

from . import views

app_name = 'novel'
urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    path('<slug:book_slug>/', views.BooklistView.as_view(), name='detail'),
]

在视图.py在

from django.urls import reverse
from django.views.generic import ListView, DetailView, UpdateView
from django.shortcuts import get_object_or_404
from .models import Book, Chapter

class IndexView(ListView):
    template_name = 'novel/index.html'
    context_object_name = 'lib_books'
    def get_queryset(self):
        return Book.objects.all()

class BooklistView(ListView):
    template_name = 'novel/detail.html'
    context_object_name = 'book_chapters'
    def get_queryset(self, request, slug):
        return Chapter.objects.filter(slug=book_slug)

在索引.html在

{% if lib_books %}
    <ul>
    {% for book in lib_books %}
            <li><a href="{% url 'novel:detail' book.slug %}">{{ book.name }}</a></li>
        {% endfor %}
    </ul>
{% else %}
    <p>No page available.</p>
{% endif %}

在bookdetail.html在

{% if book_chapters %}
    <ul>
    {{ chapter.book.title }} {{ book.number }} Chapters
    {% for chapter in book_chapters %}
        <li>{{ chapter.number }}</li>
    {% endfor %}
    </ul>
{% else %}
<p>No page available.</p>
{% endif %}

Tags: djangonamefromimportselfnumbermodelsli