Menu
CoddyTech

Trang tác giả

Thuộc phần Model và trang quản trị trong hành trình Django của Coddy. Bài học 22 trên 23.

Kệ sách của bạn có một trang cho mỗi cuốn sách nhưng không có trang nào dành cho tác giả. Dự án này tạo trang đó từ những gì bạn đã biết: một view truy vấn cơ sở dữ liệu, một URL, một template theo các quan hệ và một QuerySet không chạy truy vấn cho mỗi hàng.

Mỗi tác giả được liệt kê cùng các cuốn sách của họ: một vòng lặp qua các tác giả, bên trong là một vòng lặp qua sách của từng tác giả. Nếu không có trợ giúp, vòng lặp bên trong chạy một truy vấn cho mỗi tác giả. select_related() không thể giúp gì, vì quan hệ từ tác giả đến sách là quan hệ ngược. Phương thức đi cùng nó, prefetch_related(), lấy các hàng liên quan của mọi đối tượng trong danh sách bằng thêm một truy vấn. Book.objects.prefetch_related("loans") lấy các khoản mượn của mọi cuốn sách bằng thêm một truy vấn. Phương thức này nhận tên quan hệ.

Yêu cầu nêu rõ trang cần làm gì; phần code là của bạn.

challenge icon

Thử thách

Trung bình

Tạo trang tác giả.

  1. Trong books/views.py, viết author_list: hiển thị books/author_list.html cùng với tất cả tác giả, sử dụng prefetch_related().
  2. Trong books/urls.py, thêm authors/ với tên authors.
  3. Trong author_list.html, tạo một <section class="author"> cho mỗi tác giả: tên nằm trong <h2>, mỗi cuốn sách có một <li> liên kết tiêu đề đến trang sách.
  4. Trong books/base.html, thêm liên kết Authors vào <header>.

Nhấp vào Authors: Herbert liệt kê Children of Dune và Dune.

Tự làm thử

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})

Tất cả bài học trong Model và trang quản trị

Tự luyện tập: Playground Django