作者页面
本课属于 Coddy Django 学习旅程的“模型和管理后台”单元。第 22 课,共 23 课。
你的书架为每本书都有一个页面,却没有作者页面。这个项目会根据你已掌握的知识来创建一个页面:一个查询数据库的视图、一个 URL、一个沿着关联关系读取数据的模板,以及一个不会为每一行都运行一次查询的 QuerySet。
每位作者都会和他们的书一起列出:先遍历作者,再在循环中遍历每位作者的书。如果没有帮助,内层循环就会为每位作者运行一次查询。select_related() 无法帮上忙,因为从作者到他们的书属于反向关联。它的搭档 prefetch_related() 会通过额外的一次查询,获取列表中每个对象关联的行。Book.objects.prefetch_related("loans") 会通过一次额外查询获取每本书的所有借阅记录。它接收关联名称。
任务说明了这个页面必须做什么;代码由你来写。
挑战
中等创建作者页面。
- 在
books/views.py中,编写author_list:使用prefetch_related()获取所有作者,并渲染books/author_list.html。 - 在
books/urls.py中,添加名为authors的authors/路径。 - 在
author_list.html中,为每位作者添加一个<section class="author">:将作者姓名放在<h2>中,每本书用一个<li>,并将书名链接到对应页面。 - 在
books/base.html的<header>中添加指向Authors的链接。
点击“作者”:Herbert 会列出 Children of Dune 和 Dune。
亲手试试
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})
模型和管理后台中的所有课
自己练习: Django 在线编辑器