2011-12-28 78 views
0

我有一个名为Tip的表和FavoritedTips表。用户最喜欢的提示在我的应用程序中,提示ID和用户ID被添加到favoritedTips表中。在django对象集中标记最爱

class FavoritedTip(models.Model): 
    tip = models.ForeignKey(Tip) 
    user = models.ForeignKey(User) 

我现在需要在提示出现在列表中时在提示旁边加一个星号。但当然tips = Tip.objects.filter(list=list)没有tip.favoritedtip列。

在我的模板中最容易知道哪些提示已被收藏?

回答

1

我认为你想要显示一个提示列表,并且你需要知道每个提示是否是当前用户的最爱。

您可以用自定义templatetag做,如果你真的想这样做,在模板级别,但你最好建立在认为你的数据结构:

tips = Tips.objects.filter(my_filters) 
user_favorite_tips = request.user.favoritedtip_set.values_list('pk', flat=True) 
tips = [{'tip': tip, 
     'is_favorite': tip.pk in user_favorite_tips and True or False} 
     for tip in tips] 

然后在您的模板:

<ul> 
{% for tip in tips %} 
    <li>{{ tip.tip.as_html }} 
     {% if tip.is_favorite %} <img src="star.png" />{% endif %}</li> 
{% endfor %} 
</ul> 
+0

'tip.pk在user_favorite_tips和True或False'不是这个重言式的第二部分? – Elliott 2011-12-28 03:44:08

+0

@我遇到的问题是,当没有登录的用户 – Brenden 2011-12-28 06:57:29

+0

@Brenden,这不是问题。如果你的用户没有登录,你仍然有一个AnonymousUser实例,它们的行为相同。深入了解'auth'软件包文档。 – Stan 2011-12-28 12:54:02

0

您可以通过执行2个查询做如下:

1:创建一个包含当前用户收藏

favorite_set = set(Tip.objects.filter(favoritedtip_set__user__exact=currentUser).values_list('id',flat=True)) 

2的提示ID的set:(您可能希望在模板中执行此操作)对于每个Tip对象,检查该对象的ID是否在favorite_set中。如果是的话,在它旁边放一颗星星。

+0

你知道我该怎么做#2模板? – Brenden 2011-12-28 03:03:15

+0

将它作为上下文变量传递:'return render_to_response('template.html',{'favorite_set':favorite set})'然后在你的模板中,有一个if语句{{if if tip.id in favorite_set%}

这个技巧是最受欢迎的

{%endif%}' – Elliott 2011-12-28 03:40:01