Menu
CoddyTech

作者页面

本课属于 Coddy Django 学习旅程的“模型和管理后台”单元。第 22 课,共 23 课。

你的书架为每本书都有一个页面,却没有作者页面。这个项目会根据你已掌握的知识来创建一个页面:一个查询数据库的视图、一个 URL、一个沿着关联关系读取数据的模板,以及一个不会为每一行都运行一次查询的 QuerySet。

每位作者都会和他们的书一起列出:先遍历作者,再在循环中遍历每位作者的书。如果没有帮助,内层循环就会为每位作者运行一次查询。select_related() 无法帮上忙,因为从作者到他们的书属于反向关联。它的搭档 prefetch_related() 会通过额外的一次查询,获取列表中每个对象关联的行。Book.objects.prefetch_related("loans") 会通过一次额外查询获取每本书的所有借阅记录。它接收关联名称。

任务说明了这个页面必须做什么;代码由你来写。

challenge icon

挑战

中等

创建作者页面。

  1. 在 books/views.py 中,编写 author_list:使用 prefetch_related() 获取所有作者,并渲染 books/author_list.html。
  2. 在 books/urls.py 中,添加名为 authors 的 authors/ 路径。
  3. 在 author_list.html 中,为每位作者添加一个 <section class="author">:将作者姓名放在 <h2> 中,每本书用一个 <li>,并将书名链接到对应页面。
  4. 在 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 在线编辑器