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.
Thử thách
Trung bìnhTạo trang tác giả.
- Trong
books/views.py, viếtauthor_list: hiển thịbooks/author_list.htmlcùng với tất cả tác giả, sử dụngprefetch_related(). - Trong
books/urls.py, thêmauthors/với tênauthors. - 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. - Trong
books/base.html, thêm liên kếtAuthorsvà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