我有一个可以添加到用户收藏夹的模型书。所以我定义了两个类:
class Book(models.Model):
name = models.CharField(max_length = 40)
class UserFavorite(models.Model):
book = models.ForeignKey(Book)
user = models.ForeignKey(User)
现在,我想在主页上显示带有图标的热门图书“添加到收藏夹”或“从收藏夹中删除”。基本上我将一系列流行书籍传递给模板,并从模板中循环通过这个数组,并且应该说“if book.is_in_favorites(request.user):...”,但这不可能来自模板。
答案 0 :(得分:3)
最常见的方法是在视图中装饰书籍对象。在视图代码中,遍历书籍,添加一个布尔值,指示它们是否是当前用户的最爱:
for b in books:
b.is_fav = b.is_in_favorites(request.user)
然后在模板中:
{% for b in books %}
blah blah {{b.blah}}
{% if b.is_fav %}FAVORITE INDICATOR{% endif %}
{% endfor %}
如果您不喜欢修改图书对象,可以列出包含书籍及其注释的词典:
book_info = [{'book':b, 'is_fav':b.is_in_favorites(request.user)} for b in books]
并在您的模板中使用它:
{% for bi in book_info %}
blah blah {{b.book.blah}}
{% if bi.is_fav %}FAVORITE INDICATOR{% endif %}
{% endfor %}
答案 1 :(得分:1)
我不明白这与模板有什么关系。您只需要显示一个视图的链接,该视图将book id作为参数,从请求中获取用户,并使用这两个添加UserFavourite。
修改后更新:好的,我现在了解您的问题。好吧,正如您所发现的,这种事情太复杂了,无法放入模板逻辑中。它确实需要在您的视图中或模板标记中。可能模板标签最好,因为毫无疑问您希望在多个视图/模板中使用此功能。
您可能希望使用包含标记,因为它具有能够自动获取上下文的好处。像(未经测试)的东西:
@register.inclusion_tag('add_to_favourites.html', takes_context=True)
def favourite_links(context):
user = context['request'].user
books = Book.objects.exclude(userfavourite__in=user)
return {'books': books, 'user':user}
现在你只需要一个模板片段,它使用上面标签返回的书中的值来呈现一个列表。在您的主模板中,只需使用favourite_links
即可显示图书链接。