首页 > 解决方案 > 基于 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 %}

标签: pythondjangoforeign-keysdjango-class-based-views

解决方案


推荐阅读