一对多 多对一
关键解释
-
反向关系名称:(主要用于一对多中的一表并且没有定义相关外检字段)
-
你的
Book
模型中未指定related_name(相关名称)
,所以默认反向查询名称为book_set
(格式:关联模型小写_set
)。
<td> {# 遍历该出版社下的所有书籍 #}{# 反向查询该出版社的所有书籍 #}{% for book in press.book_set.all %}{{ book.bookname }}(价格:{{ book.bookprice }}){% if not forloop.last %}<br>{% endif %}{% empty %}<span style="color: gray;">该出版社暂无书籍</span>{% endfor %}<td>
-
如果希望自定义名称(如
books
),可以在外键中添加related_name='books'
,模板中则用press.books.all
。 -
这里是多对一中的多表(book表已经定义相关联的字段了)
{# forloop.counter 循环多少次 编号会随之变化 #}<td>{{ book.bookname }}</td><td>{{ book.bookprice }}</td><td>{{ book.bookauthor }}</td><td>{{ book.press.pressname }}</td><td>{% if book.bookimg %}<img src="{{ book.bookimg }}" alt="暂无图片" style="height: 100px">{% else %}<span class="text-muted">暂无图片</span>{% endif %}</td>
-
-
模板语法:
-
press.book_set.all
:获取该出版社关联的所有书籍。 -
{% empty %}
:如果没有书籍时显示占位内容。 -
forloop.last
:判断是否为最后一次循环,避免最后一个书籍后显示多余的<br>
。
-
-
字段显示:
-
根据你的
Book
模型字段,可以显示bookname
、bookprice
、bookauthor
或bookimg
。
-
传参问题:
book项目中bookyemian的详情点击后
<!-- 修改原来的详情按钮 --><a href="{% url 'bookshopping' book.id %}" class="btn btn-detail"><i class="fa fa-info-circle"></i> 详情</a>
url.py
path("bookshopping/<int:book_id>", views.bookshopping, name="bookshopping")
view.py返回数据对象
def bookshopping(request,book_id):book = Book.objects.get(id=book_id)return render(request, "book/bookshopping.html", {"book": book})