2014-10-05 52 views
0

我有一个Article模型,我从当用户成功登录获取如果声明:检查列表以及在循环使用Python/Django的

articles = Article.objects.all() 

我也有Likes模型,该模型具有user_idarticle_id到记录用户喜欢的文章。

​​

article_id给出文章的用户列表都喜欢,而users_who_liked给谁喜欢这些文章的用户列表如下图所示:

articles_liked = [4, 3, 5, 6, 10] 
users_who_liked = [1, 13, 15, 16, 110] 

我想实现的是能够告诉如果某个特定帖子已被我的模板中登录的用户所喜欢,

{% for article in articles %} 
    <p>{{article.content}}</p> 
     {% if this_user_id in users_who_liked and article.id in articles_liked %} 
      <p class = 'likes'> 2 </p> 
     {% else %} 
      <p class = 'likes already_liked'> 2 </p> 
     {% endif %} 
{% endfor %} 

假设this_user_id = 1和他/她喜欢的是4的文章中,if语句的所有文章返回Trueelse块永远不会被执行。

我该如何正确地做到这一点?

回答

1

您的变量articles_likedusers_who_liked彼此不相关。他们总是包含全部赞的文章和全部喜欢的用户,但是他们之间在您的模板环境中没有关系,您可以依赖。

因此您if语句总是对谁喜欢任何文章已经喜欢通过至少一个用户每个用户返回True

从你的问题是Like有一个外键(Django docs)到User和外键Article只需要添加一个过滤器,你articles_liked分配只检索当前用户喜欢假设:

articles_liked = Likes.objects.filter(user_id=this_user_id).values_list('article_id', flat = True) 

然后在你的模板,你可以简单地检查当前的文章是在这个名单:

{% for article in articles %} 
    <p>{{article.content}}</p> 

    {% if article.id in articles_liked %} 
     <p class = 'likes'> 2 </p> 
    {% else %} 
     <p class = 'likes already_liked'> 2 </p> 
    {% endif %} 
{% endfor %} 
+0

这做到了!谢谢。 – Yax 2014-10-08 09:16:42

0

随着你喜欢的对象有这两个用户提供一个参考和文章,为什么不利用你的观点呢?你控制的逻辑视图和模板,这样,刚刚成为if语句简单:现在

def some_view(request): 
    articles = Article.objects.all() 
    user = request.user 
    article_list = [] 
    for a in articles: 
    # Create a tuple, with a flag if the user has liked this article or not. 
    article_status = (Likes.objects.filter(article_id=a.pk, user_id=user.pk).exists(), a,) 
    article_list.append(article_status) 
    return render(request, 'template.html', {'articles': article_list}) 

,在你的模板,你具备以下条件:

{% for liked,article in articles %} 
    {% if liked %} 
     <strong>You already liked this article!</strong> 
    {% endif %} 
    {{ article }} 
{% endfor %}