我现在有一个模型,我想在同一个视图中显示它的两个字段。然后在详细信息模板中显示它们。但结果返回空in template。最好的方法是什么?
我的模特:
class Book(models.Model):
class Meta :
verbose_name_plural = 'Books'
category = models.ForeignKey(Categorie,on_delete=models.CASCADE,null=True,
related_name="apps")
book_slug = models.SlugField(blank=True,allow_unicode=True,editable=True)
book_title = models.CharField(max_length=50 , null=True)
book_picture = models.ImageField(upload_to='imgs' , null=True)
book_description = RichTextUploadingField(null=True,blank=True)
book_size = models.CharField(max_length=20 , null=True)
book_created_at = models.DateField(auto_now_add=True)
book_updated_at = models.DateField(auto_now=True)
book_auther = models.CharField(max_length=100 , null=True)
我的看法:
def book_details(requset ,book_slug):
book = get_object_or_404 (Book, book_slug = book_slug)
try :
book = Book.objects.filter(book_slug = book_slug)
except :
raise Http404
similar_books = Book.objects.filter(book_auther = book_slug) ------ >>> Here is my query
context ={
'book' :book,
'similar_books':similar_books,
}
return render( requset,'book.html',context)
我的模板:
<div class="row">
{% for b in book %}
<div>
<img src="{{ b.book_picture.url }}" class="Rounded circle Image" height="150"
width="150" alt="">
<a href="{{b.get_absolute_url}}">{{b.book_title}}</a>
</div>
{% endfor %}
</div>
<div class="row">
{% for sb in similar_books%}
<div>
<img src="{{ sb.book_picture.url }}" class="Rounded circle Image" height="150"
width="150" alt="">
<a href="{{sb.get_absolute_url}}">{{sb.book_title}}</a>
</div>
{% endfor %}
</div>
3条答案
按热度按时间hpxqektj1#
首先
这是一个get方法,如果找到book的单个示例(不是Queryset),则返回该示例
那么您就是在重复同样的事情,在我看来,这段代码可以丢弃,因为它是上面一行的重复
然后在模板中,您不必循环使用book:这是一个单独对象,而不是一个可枚举的查询集,因此您应该编写
关于第二个查询,根据示例数据,您不能使用筛选器提取数据,而必须以以下方式处理:
puruo6ea2#
坚持使用过滤器(book_slug = book_slug)使用__图标与Q对象(使用book_slug中的每个单词以获得最大相似条目)。例如:-
如果您希望消除如上所述显式循环,可以使用operator来实现。
mlmc2os53#
尝试通过第一个查询获取一本书的列表,并在第二个查询中筛选所有作者相同的书
如果要从类似帐簿中排除帐簿