Menu
CoddyTech

搜索书籍

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

你的书架需要一个搜索框。搜索页面会从地址中读取访客输入的内容。在 /search/?q=dune 中,? 后面的部分是查询字符串,Django 会将其中的键值对放入 request.GET,它的工作方式类似字典。页眉中的搜索框是一个表单,可以帮你生成这个地址;表单单元会介绍表单。显示某个类型图书的页面可以这样读取它:

def by_genre(request):
    genre = request.GET.get("genre", "fiction")
    books = Book.objects.filter(genre=genre)
    return render(request, "books/genre.html", {"genre": genre, "books": books})

如果地址中没有 genre,.get("genre", "fiction") 会返回默认值;而 request.GET["genre"] 在这种情况下会引发错误,导致 500 错误。值始终是文本:?page=2 会得到 "2"。每个标题都包含空字符串 "",因此 __icontains="" 会匹配每一行。

challenge icon

挑战

简单

添加一个搜索页面。模板 books/search.html 已准备好,并且需要 q 和 books。

  1. 在 books/views.py 中,编写一个名为 search 的视图,从地址中读取 q(缺少时使用空文本),并查找标题中包含该内容的图书,不区分大小写。
  2. 在 books/urls.py 中,添加路由 search/,并命名为 search。

点击“运行”,然后在页眉中搜索 dune:“搜索“dune”的结果”会列出 Dune,而 xyz 会显示 No books match。

亲手试试

from django.shortcuts import get_object_or_404, render

from .models import Book


def home(request):
    books = Book.objects.all()
    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})
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

模型和管理后台中的所有课

自己练习: Django 在线编辑器