Menu
CoddyTech

Tên liên quan

Thuộc phần Model và trang quản trị trong hành trình Django của Coddy. Bài học 17 trên 23.

Trang sách có thể liệt kê những cuốn sách khác của tác giả. Điều đó nghĩa là đi từ tác giả quay lại các cuốn sách của họ: ForeignKey hoạt động theo cả hai chiều. Với một Loan trỏ đến một cuốn sách, loan.book đi theo chiều thuận, còn Django thêm một trình quản lý vào Book để truy cập theo chiều ngược lại, với tên ghép từ tên model và _set: book.loan_set.all(). related_name giúp đặt tên dễ hiểu hơn:

book = models.ForeignKey(Book, on_delete=models.PROTECT, related_name="loans")

Giờ đây, book.loans.all() trả về các khoản mượn cuốn sách đó, book.loans.count() hoạt động giống như với Loan.objects, còn loan_set không còn tồn tại.

Trong template, bạn truy cập các quan hệ bằng dấu chấm và gọi phương thức không cần dấu ngoặc đơn: Trên trang của một cuốn sách, {% for loan in book.loans.all %} liệt kê các khoản mượn cuốn sách đó. Nếu viết sai tên, template sẽ không hiển thị gì mà không báo lỗi, vì vậy khi danh sách trống, trước tiên hãy kiểm tra tên.

challenge icon

Thử thách

Dễ

Liệt kê các sách khác của tác giả trên trang của mỗi cuốn sách.

  1. Trong books/models.py, đặt tên liên kết ngược của Book.author là books, để author.books.all() trả về mọi cuốn sách của tác giả đó.
  2. Trong book_detail.html, thêm một <h2> như More by Frank Herbert và một <ul class="more"> liệt kê mọi cuốn sách của tác giả đó, mỗi cuốn là một liên kết đến trang của sách, phía trên liên kết Quay lại.

Nhấn Chạy rồi nhấp vào Dune: bên dưới More by Frank Herbert, bạn sẽ thấy Children of Dune và Dune.

Tự làm thử

{% extends "books/base.html" %}

{% block title %}{{ book.title }}{% endblock %}

{% block content %}
<h1>{{ book.title }}</h1>
<p class="author">by {{ book.author }}</p>
<ul>
    <li>Published in {{ book.year }}</li>
    <li>Genre: {{ book.get_genre_display }}</li>
    <li>Price: {{ book.price }}</li>
</ul>
<p><a href="{% url 'books:home' %}">Back to the shelf</a></p>
{% endblock %}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Model và trang quản trị

Tự luyện tập: Playground Django