Yazarlar Sayfası
Coddy'nin Django Journey'sinin Modeller ve Yönetim Paneli bölümünün bir parçası. Ders 22 / 23.
Kitaplığında her kitap için bir sayfa var, ancak yazarlar için yok. Bu proje, bildiklerinden yararlanarak böyle bir sayfa oluşturuyor: veritabanını sorgulayan bir görünüm, bir URL, ilişkileri izleyen bir şablon ve her satır için ayrı bir sorgu çalıştırmayan bir QuerySet.
Her yazar, kitaplarıyla birlikte listeleniyor: yazarlar üzerinde bir döngü ve bunun içinde her yazarın kitapları üzerinde bir döngü. Yardım olmadan içteki döngü, her yazar için bir sorgu çalıştırır. select_related() yardımcı olamaz, çünkü yazardan kitaplarına giden ilişki ters ilişkidir. Eşi olan prefetch_related(), listedeki her nesnenin ilişkili satırlarını bir ek sorguyla getirir. Book.objects.prefetch_related("loans"), her kitabın ödünç alma kayıtlarını tek bir ek sorguyla getirir. İlişki adını alır.
Görev, sayfanın ne yapması gerektiğini söylüyor; kod sana ait.
Görev
OrtaYazarlar sayfası oluştur.
books/views.pyiçinde, her yazarıprefetch_related()kullanarakbooks/author_list.htmlile görüntüleyenauthor_listfonksiyonunu yaz.books/urls.pyiçindeauthors/yolunuauthorsadıyla ekle.author_list.htmliçinde her yazara bir<section class="author">ver: adı bir<h2>içinde, her kitap için başlığını kendi sayfasına bağlayan bir<li>oluştur.books/base.htmliçinde,<header>bölümüneAuthorsbağlantısını ekle.
Authors'a tıkla: Herbert için Children of Dune ve Dune listelenir.
Kendin dene
from django.shortcuts import get_object_or_404, render
from .models import Book
def home(request):
books = Book.objects.select_related("author")
return render(request, "books/home.html", {"books": books})
def book_detail(request, pk):
book = get_object_or_404(Book, pk=pk)
return render(request, "books/book_detail.html", {"book": book})
def search(request):
q = request.GET.get("q", "")
books = Book.objects.filter(title__icontains=q).select_related("author")
return render(request, "books/search.html", {"q": q, "books": books})
Modeller ve Yönetim Paneli bölümündeki tüm dersler
Kendi başına pratik yap: Django playground