使用Python / Django在循环中检查带有If语句的列表

时间:2014-10-05 04:46:32

标签: python django python-2.7 django-templates

我有一个Article模型,我从用户成功登录时获取该模型:

articles = Article.objects.all()

我还有Likes模型,其中有user_idarticle_id来记录用户喜欢的文章。

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

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,他/她喜欢的文章是4if语句会为所有文章和{{1}返回True阻止永远不会被执行。

我怎样才能以正确的方式做到这一点?

2 个答案:

答案 0 :(得分:1)

您的变量articles_likedusers_who_liked彼此不相关。它们始终包含所有喜欢的文章和所有喜欢的用户,但在它们之间,您可以依赖的模板上下文中没有任何关系。

因此,对于至少有一个用户喜欢的任何文章的每个用户,您的if语句将始终返回True

从您的问题中假设Like有一个外键(Django docs)到User,外键到Article,您可以在articles_liked添加一个过滤器1}}赋值仅从当前用户检索喜欢:

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

答案 1 :(得分:0)

由于您的Likes对象具有对用户和文章的引用,为什么不在您的视图中利用它?这样你就可以控制视图中的逻辑,模板就变成了一个简单的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 %}