Trang riêng cho mỗi cuốn sách
Thuộc phần Model và trang quản trị trong hành trình Django của Coddy. Bài học 14 trên 23.
Mỗi cuốn sách cần có một trang với địa chỉ riêng: /books/1/, /books/2/. Bộ chuyển đổi đường dẫn trong Django Basics lấy số đó và truyền nó cho view. Trang hiển thị các cuốn sách của một năm:
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})Trang hiển thị một hàng dùng khóa chính để đặt tên cho hàng đó, pk: tức là id của hàng. Nếu không tìm thấy hàng, get() sẽ gây ra ngoại lệ. Ngoại lệ trong view sẽ khiến ứng dụng gặp sự cố, 500 Server Error. Thay vào đó, get_object_or_404() trong django.shortcuts sẽ trả về 404 Page not found. Hàm này nhận model trước, rồi đến các điều kiện: get_object_or_404(Book, title="Emma").
Để liên kết đến một route lấy giá trị, hãy đặt giá trị sau tên route: {% url 'books:books_of_year' book.year %}.
Thử thách
Trung bìnhHãy tạo một trang cho mỗi cuốn sách. Mẫu books/book_detail.html đã sẵn sàng và cần book.
- Trong
books/views.py, viếtbook_detail(request, pk): hàm này hiển thị cuốn sách có id đó hoặc trả về lỗi 404. - Trong
books/urls.py, định tuyến/books/<id>/, chỉ nhận số, đến hàm này với tênbook_detail. - Trong
home.html, liên kết từng tiêu đề đến trang của cuốn sách đó. Chỉ tiêu đề là liên kết:<a ...>Dune</a> (1965).
Nhấp vào Dune trên trang chủ, rồi mở /books/999/: Không tìm thấy trang (404).
Tự làm thử
from django.shortcuts import render
from .models import Book
def home(request):
books = Book.objects.all()
return render(request, "books/home.html", {"books": books})
Tất cả bài học trong Model và trang quản trị
Tự luyện tập: Playground Django