Django模板用户请求

时间:2009-08-16 18:14:19

标签: django templates request

我有一个可以添加到用户收藏夹的模型书。所以我定义了两个类:


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):...”,但这不可能来自模板。

2 个答案:

答案 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即可显示图书链接。