python - 基于 Django 类的视图相关字段映射 url
问题描述
我无法让小说网页返回包含特定书籍相应章节的视图。我的索引页面列出了 Book 模型类的所有对象,并将它们超链接到带有 slug 字段的详细信息页面。
<li><a href="{% url 'bible:detail' book.slug %}">{{ book.name }}</a></li>
这应该使用 slug 参数调用我的 detail.html 页面(对???)。详细视图与 Chapter 模型类一起使用,该类通过外键(id 号)链接到 Book 模型类。我意识到章节模型类没有自己的 slug 字段,但我认为它应该能够通过与书籍模型的关系映射 url。是错误的假设吗?我知道我可以将 slug 字段添加到章节模型中,但这似乎是多余的,因为该应用程序是一个翻译器,我最终将为每章中的句子创建一个模型类。我怎样才能让它工作?我不知道我的方法是否正确,但这是我得到的错误:
TypeError at /novel/1984/
get_queryset() missing 2 required positional arguments: 'request' and 'slug'
该模型由 2 个类(Book 和 Chapter)组成,它们通过外键(在 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 %}