关键解释
反向关系名称:(主要用于一对多中的一表并且没有定义相关外检字段)
你的
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})