关联名称
本课属于 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 %} 会列出这本图书的借阅记录。名称拼写错误时不会显示任何内容,也不会报错,所以列表为空时,先检查名称。
挑战
简单在每本书的页面上列出作者的其他书籍。
- 在
books/models.py中,为Book.author设置相关名称books,这样author.books.all()就会返回该作者的所有书籍。 - 在
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 %}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
模型和管理后台中的所有课
自己练习: Django 在线编辑器