我有两个相互关联的模型。对于一个人为的例子,第一个是事物列表,第二个是喜欢每个事物的人的列表。
我想要显示一个事项列表,如果我喜欢其中一个,那么在它旁边显示一个图标。
# in the models
class Things(models.Model):
name = models.CharField(max_length = 100)
class Likes(models.Model):
user = models.ForeignKey(User)
thing = models.ForeignKey(Thing)
# in the view
@login_required
def list_of_things(request):
things = things.objects.all()
context = RequestContext(request, {'things': things})
return render_to_response('thinglist.html', context)
# in the template
{% for thing in things %}
<li>{{ thing.name }}
## PSUEDO CODE HERE
{% if I've liked this thing %}
<img src="like.png">
{% endif %}
</li>
我发现在python shell中我可以这样做:
>>> thing.likes_set.filter(user=user)
并得到我想要的东西,但我不确定上面的代码中我应该把它放在哪里。我想了一下,如果我在我的模型中添加了一个方法,我可以在我的模板中执行:
{% if thing.liked_by_me %}
但这需要模型知道用户名。它似乎也不是最好的表现。
有什么建议吗?
答案 0 :(得分:1)
在您的最佳表现视图中,您可以获得一系列事物和您喜欢的事物清单。
def list_of_things(request):
things = things.objects.all()
things_i_like = Like.objects.filter(user=current_user).values_list('things', flat=True)
context = RequestContext(request, {'things': things, 'things_i_like':things_i_like})
return render_to_response('thinglist.html', context)
values_list只会选择'东西' flat会将QuerySet压缩成一个列表
{% for thing in things %}
<li>{{ thing.name }}
## PSUEDO CODE HERE
{% if thing in things_i_like %}
## IMAGE LINK
{% endif %}
</li>
{% endfor %}
然后模板可以遍历“事物”并检查“things_i_like”列表中是否有单个内容
我没有对此进行过测试,但它应该有效...