Menu
CoddyTech

关联名称

本课属于 Coddy Django 学习旅程的“模型和管理后台”单元。第 17 课,共 23 课。

图书页面可以列出作者的其他图书。这意味着要从作者反向查找其图书:ForeignKey 可以双向使用。使用指向图书的 Loan,loan.book 可以正向访问,而 Django 会为反向访问在 Book 上添加一个管理器,名称由模型名加上 _set 组成:book.loan_set.all()。related_name 可以让它拥有更好的名称:

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

现在,book.loans.all() 会返回这本图书的借阅记录,book.loans.count() 的用法与 Loan.objects 相同,而 loan_set 不再存在。

模板使用点号访问关联,并且调用方法时不加括号:在图书页面上,{% for loan in book.loans.all %} 会列出这本图书的借阅记录。名称拼写错误时不会显示任何内容,也不会报错,所以列表为空时,先检查名称。

challenge icon

挑战

简单

在每本书的页面上列出作者的其他书籍。

  1. 在 books/models.py 中,为 Book.author 设置相关名称 books,这样 author.books.all() 就会返回该作者的所有书籍。
  2. 在 book_detail.html 中,在返回链接上方添加一个类似 <h2> 的标题,例如 More by Frank Herbert,并添加一个 <ul class="more">,列出该作者的所有书籍,每本书都链接到对应的页面。

点击“运行”,再点击 Dune:你会在 More by Frank Herbert 下看到 Children of Dune 和 Dune。

亲手试试

{% 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 icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

模型和管理后台中的所有课

自己练习: Django 在线编辑器