Как фильтровать книги, чтобы получать книги авторов, а не все доступные книги, при использовании ListView и DetailView (Django)

Книги авторов должны отображаться только при нажатии на имя автора в ListView.

models.py

from django.db import models
from django.contrib.auth.models import User
from django.urls import reverse
from django.utils.text import slugify

class Author(models.Model):´
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    slug = models.SlugField(unique=True, blank=False, null=False)


class Book(models.Model):

    author = models.ForeignKey(Author, on_delete=models.CASCADE, null=False, blank=False)
    title = models.CharField(max_length=200)
    price = models.FloatField()
    image = models.ImageField(null=True, blank=True)

views.py

from app.models import Book, Author
from django.shortcuts import render, redirect
from django.contrib.auth.models import User, Group
from django.views.generic.list import ListView
from django.views.generic.detail import DetailView

class HomeView(ListView):
    model = Author
    ordering = ['-id']
    template_name = 'app/home.html'


class AuthorView(DetailView):
    model = Author
    template_name = 'app/author.html'
    

    def get_context_data(self, *args, **kwargs):
        # author_pk = self.kwargs.get('pk', None)

        # Tried this logic, but it makes no sense after I looked at it more close
        books = Book.objects.all()
        if books.author is Author.pk:
            books_filtered = books.objects.all()

        

        context = super(AuthorView, self).get_context_data(*args, **kwargs)

        context['books'] = books_filtered
        return context

Теперь, когда все авторы отображаются на главной странице с ListView, когда кто-то нажимает на автора, он должен увидеть только книги, созданные автором с DetailView

Эту ссылку я пробовал, но она отображает только все книги

Вы можете использовать self.object для фильтрации книг:

def get_context_data(self, *args, **kwargs):
    books = Book.objects.filter(author=self.object)
    ...

Вам не нужно передавать это в шаблон. В шаблоне вы можете работать с:

{% for book in object.book_set.all %}
    {{book.title }}
{% endfor %}

Здесь object находится Author, для которого мы извлекаем книги.

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