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

使用Python/Django在循环中检查带有If语句的列表,python,django,python-2.7,django-templates,Python,Django,Python 2.7,Django Templates,我有一个文章模型,当用户成功登录时,我从中获取该模型: articles = Article.objects.all() 我还有Likes模型,它有user\u id和article\u id来记录用户喜欢的文章 articles_liked = Likes.objects.values_list('article_id', flat = True) users_who_liked = Likes.objects.values_list('user_id', flat = True) art

我有一个
文章
模型,当用户成功登录时,我从中获取该模型:

articles = Article.objects.all()
我还有
Likes
模型,它有
user\u id
article\u id
来记录用户喜欢的文章

articles_liked = Likes.objects.values_list('article_id', flat = True)
users_who_liked = Likes.objects.values_list('user_id', flat = True)
article\u id
给出了用户喜欢的文章列表,而
users\u who\u loke
给出了喜欢这些文章的用户列表,如下所示:

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 %}
{%用于文章%中的文章]
{{article.content}

{%如果用户中的用户id为,而文章中的文章id为%} {%else%} 喜欢的人已经喜欢了2

{%endif%} {%endfor%}
让我们假设
这个用户id=1
并且他/她喜欢的文章是
4
if
语句为所有文章返回
True
,而
else
块永远不会执行


如何才能正确地执行此操作?

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

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

根据您的问题,假设
Like
有一个指向
用户的外键()和一个指向
文章的外键,您只需在
articles\u Like
分配中添加一个筛选器,即可仅从当前用户检索Like:

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 %}
{%用于文章%中的文章]
{{article.content}

{%if article.id在articles_%} {%else%} 喜欢的人已经喜欢了2

{%endif%} {%endfor%}
既然您的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 %}
{%for liked,article%中的article%}
{%if%}
你已经喜欢这篇文章了
{%endif%}
{{条款}
{%endfor%}

成功了!非常感谢。