Menu
CoddyTech

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 %}.

challenge icon

Thử thách

Trung bình

Hã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.

  1. Trong books/views.py, viết book_detail(request, pk): hàm này hiển thị cuốn sách có id đó hoặc trả về lỗi 404.
  2. Trong books/urls.py, định tuyến /books/<id>/, chỉ nhận số, đến hàm này với tên book_detail.
  3. 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