我有图书模板,可显示有关图书的更多信息,例如书名,价格和作者等。
在同一模板中,我有一个相似的书籍部分,我想根据分类(与这两个书籍具有相同的分类)显示与特色书籍相似的书籍
为此,我考虑的是从数据库中检索书籍,而不是仅仅使用常规循环使之更具动态性,因为每本书都有该分类,该页面每次都显示不同的书籍,而不是同一本书< / p>
这是views.py
def book(request, book_id):
book = get_object_or_404(Book, pk=book_id)
similar_books = Book.objects.all()[:4]
book_context = {
'book': book,
'similar_books': similar_books
}
return render(request, 'books/book.html', book_context)
这是我模板中的代码
<div class="row">
<div class="col py-5 text-center">
<h3 class="mb-5">Similar books</h3>
<div class="row d-flex justify-content-center">
{% for similar_book in similar_books %}
{% if similar_book.classification == book.classification and similar_book.id > book.id %}
<div class="col-md-3">
<a href="{% url 'book' similar_book.id %}"><img src="{{ similar_book.img.url }}"></a>
<a href="{% url 'book' similar_book.id %}"><p class="mt-2">{{ similar_book.title}}</p></a>
<p class="text-muted">{{ similar_book.author }}</p>
<p>{{ similar_book.price }}</p>
</div>
{% endif %}
{% endfor %}
</div>
</div>
我之所以加入similar_book.id > book.id
是因为我不希望它在同类书籍中展示这本精选书
我知道这样做不是逻辑上最好的方法,就好像特色书是列表中的最后一本书一样,循环将停止
我还考虑将上面的if语句替换为
{% for similar_book in similar_books[{{ similar_book.id }} -1:] %}
开始在精选书籍之后循环浏览书籍,并添加if语句{% if book.id == len(similar_books) %}
然后{% similar_book.id == 1 %}
但是不确定逻辑是否正确,有什么主意吗?
答案 0 :(得分:0)
有很多类似的文章可以随机获取Django中的对象,例如this。
我建议您在视图中进行混洗:
id_list = list(
Book.objects.exclude(pk=book.pk).values_list('id', flat=True))
n = 2
rand_ids = random.sample(id_list, n)
similar_books = Book.objects.filter(id__in=rand_ids)
答案 1 :(得分:0)
不要在模板中添加逻辑,例如,如果您不想显示正在展示的书,则可以将其从查询集中排除,例如:
def book(request, book_id):
book = get_object_or_404(Book, pk=book_id)
similar_books = Book.objects.all().exclude(pk=book_id)[:4]
...
您可以使用order_by('?')
以随机顺序获得结果,因此最终看起来像这样:
def book(request, book_id):
book = get_object_or_404(Book, pk=book_id)
similar_books = Book.objects.all().exclude(pk=book_id).order_by('?')[:4]
...
请注意,order_by('?')
可能很慢。您可以在此处了解有关改组的不同方法:
How to pull a random record using Django's ORM?