每本书对应一个页面
本课属于 Coddy Django 学习旅程的“模型和管理后台”单元。第 14 课,共 23 课。
每本书都需要有一个独立地址的页面:/books/1/、/books/2/。Django Basics 中介绍的路径转换器会捕获这个数字,并将它传递给视图。显示某一年的图书的页面:
path("years/<int:year>/", views.books_of_year, name="books_of_year"),
def books_of_year(request, year):
books = Book.objects.filter(year=year)
return render(request, "books/year.html", {"year": year, "books": books})单条记录的页面用它的主键 pk 来标识,也就是它的 id。如果记录不存在,get() 会引发异常,而视图中的异常会导致崩溃,显示 500 服务器错误。django.shortcuts 中的 get_object_or_404() 则会改为响应 404 页面未找到。它先接收模型,再接收条件:get_object_or_404(Book, title="Emma")。
要链接到捕获某个值的路由,请将该值放在名称之后:{% url 'books:books_of_year' book.year %}。
挑战
中等为每本书创建一个页面。模板 books/book_detail.html 已准备好,并且需要 book。
- 在
books/views.py中,编写book_detail(request, pk):显示具有该 id 的书,或者返回 404。 - 在
books/urls.py中,将/books/<id>/(仅限数字)路由到此视图,名称为book_detail。 - 在
home.html中,将每本书的标题链接到对应页面。只有标题是链接:<a ...>Dune</a> (1965)。
在主页上点击 Dune,然后打开 /books/999/:页面未找到(404)。
亲手试试
from django.shortcuts import render
from .models import Book
def home(request):
books = Book.objects.all()
return render(request, "books/home.html", {"books": books})
模型和管理后台中的所有课
自己练习: Django 在线编辑器