这个记录与我有关吗?

时间:2011-06-11 18:50:46

标签: django django-models foreign-key-relationship

我有两个相互关联的模型。对于一个人为的例子,第一个是事物列表,第二个是喜欢每个事物的人的列表。

我想要显示一个事项列表,如果我喜欢其中一个,那么在它旁边显示一个图标。

# 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 %}

但这需要模型知道用户名。它似乎也不是最好的表现。

有什么建议吗?

1 个答案:

答案 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”列表中是否有单个内容

我没有对此进行过测试,但它应该有效...