Как фильтровать книги, чтобы получать книги авторов, а не все доступные книги, при использовании 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
, для которого мы извлекаем книги.