python - Book object is not iterable: 试图根据一个字段显示一个实例的相似对象
问题描述
我正在开展一个图书馆项目,该项目展示书籍,每本书都属于一个类别(历史、数学、冒险等)。在书籍的详细视图中,我想要一个链接(带有“查看此类别中的类似书籍”),它将用户重定向到当前书籍的同一类别的其他书籍。因此,如果一本书的详细信息页面具有“历史”类别,则链接将指向“历史”类别中的其他书籍。重定向到另一个模板(插件:在帮助我的过程中,我很想在同一页面中显示“相似的书籍”,而不是不同的页面)
错误详情
TypeError at /search/similar/bootsrtap/
'Book' object is not iterable
模型.py
class Category(models.Model):
name = models.CharField(max_length=255)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('index')
choices = Category.objects.all().values_list('name', 'name')
choice_list = []
for item in choices:
choice_list.append(item)
class Book(models.Model):
title = models.CharField(max_length=255)
author = models.CharField(max_length=255)
category = models.CharField(max_length=255, choices=choice_list)
slug = models.SlugField(max_length=100, unique=True)
def __str__(self):
return self.author + ": " + self.title
def get_absolute_url(self):
return reverse('detail', kwargs={'slug': self.slug})
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.title)
return super().save(*args, **kwargs)
def similar_book(self):
return Book.objects.filter(category=self.category)
网址.py
urlpatterns = [
path('detail/<slug:slug>/', BookDetail.as_view(), name='detail'),
path('search/similar/<slug:slug>/', views.search_similar_results, name='search_similar_results'),
视图.py
def search_similar_results(request, slug):
books = get_object_or_404(Book, slug=slug)
books.similar_book()
return render(request, 'book/similar_results.html', {'books': books})
class BookDetail(generic.DetailView):
model = Book
context_object_name = 'book'
template_name = 'book/detail.html'
指向模板的可点击链接
<a href="{% url 'search_similar_results' slug=book.slug %}">Click to see Similar books in this category</a></h3>
<div class="row">
模板
<div class="row">
{% if books %}
{% for book in books %}
<h2>Similar Books in {{ book.category } Category}</h2>
<figure class="col-lg-3 col-md-4 col-sm-6 col-12 tm-gallery-item animated bounce infinite">
<a href="{{ book.get_absolute_url }}">
<div class="tm-gallery-item-overlay">
{% if book.cover %}
<img src="{{ book.cover.url }}" alt="Image" class="img-fluid tm-img-center">
{% endif %}
<p class="small font-italic">Author: {{ book.author }}</p>
<p class="small font-italic text-left">Title: {{ book.title }}</p>
<p class="small font-italic">Category: {{ book.category }}</p>
</div>
</a>
</figure>
{% endfor %}
{% else %}
<p>There are No Available Books</p>
{% endif %}
</div>
详细信息.html
<div class="tm-main-content no-pad-b">
<!-- Book Detail Page Display -->
<section class="row tm-item-preview">
{% if book.cover %}
<div class="col-md-6 col-sm-12 mb-md-0 mb-5">
<img src="{{ book.cover.url }}" alt="Image" class="img-fluid tm-img-center-sm card-img-top">
<h2>Title {{ book.title }}</h2>
</div>
{% else %}
<p>No book cover</p>
{% endif %}
</section>
<!-- Similar Books Display by Category -->
<div class="tm-gallery no-pad-b">
<h3 style="color: white; text-align: center;"><a href="{% url 'search_similar_results' slug=book.slug %}">Similar books you might be interested in</a></h3>
<div class="row">
{% for item in similar_book%}
<figure class="col-lg-3 col-md-4 col-sm-6 col-12 tm-gallery-item">
<a href="{{ book.get_absolute_url }}">
<div class="tm-gallery-item-overlay">
<img src="{{ book.cover.url }}" alt="Image" class="img-fluid tm-img-center">
</div>
<p class="tm-figcaption">Title: {{ book.title}}</p>
<p class="tm-figcaption">Category: {{ book.category }}</p>
</a>
</figure>
{% endfor %}
</div>
</div>
</div>
解决方案
您需要将类似书籍的结果传递给模板,因此:
def search_similar_results(request, slug):
book = get_object_or_404(Book, slug=slug)
books = book.similar_book()
return render(request, 'book/similar_results.html', {'books': books})
在 中DetailView
,您可以通过`类似的书籍:
class BookDetail(generic.DetailView):
model = Book
context_object_name = 'book'
template_name = 'book/detail.html'
def similar_books(self):
return self.object.similar_book()
然后在我们使用的模板中:
{% for item in view.similar_books %}
<!-- … -->
{% endfor %}
推荐阅读
- vba - 如何使用 VBA Selenium 单击复选框跨度类
- c - 使用 OpenMP 执行并行代码比执行串行代码需要更多时间
- google-cloud-dataflow - TFX Evaluator 不在 Dataflow 中运行,因此由于 pod 内存不足而失败
- python - 你如何让棋盘功能在 spyder 3.7 上工作?
- unity3d - 用于 Unity 的 xUnit 测试
- html - 以透明 png 精灵为背景图像的列表单击故障
- javascript - 如何在 Vue.js 中在两个不同的条件下绑定两个类?
- python - 使用 Flask Jinja2 模板将 JSON 数据发布到基于日期的表中
- go - go - 如何使用证书存储中的证书并在 gin 框架中运行 TLS?
- visual-studio-code - 如何停止 VSCode 选择错误的语法错误