搜索书籍
本课属于 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="" 会匹配每一行。
挑战
简单添加一个搜索页面。模板 books/search.html 已准备好,并且需要 q 和 books。
- 在
books/views.py中,编写一个名为search的视图,从地址中读取q(缺少时使用空文本),并查找标题中包含该内容的图书,不区分大小写。 - 在
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})
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
模型和管理后台中的所有课
自己练习: Django 在线编辑器