使用 Python/Django 在循环中使用 if 语句检查列表

Posted

技术标签:

【中文标题】使用 Python/Django 在循环中使用 if 语句检查列表【英文标题】:Check a List With If Statement in a Loop Using Python/Django 【发布时间】:2014-11-29 17:41:08 【问题描述】:

我有一个 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 语句为所有文章返回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 %

【讨论】:

做到了!谢谢。【参考方案2】:

由于您的 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 %

【讨论】:

以上是关于使用 Python/Django 在循环中使用 if 语句检查列表的主要内容,如果未能解决你的问题,请参考以下文章

Python Django - 模型:查询/过滤器中的 for 循环

Python/Django 通过循环从变量创建几个类

使用 mptt 在 Python / Django 中创建 JSON 以反映树结构的最快方法

python3--django for 循环中,获取序号

在 python/Django 中多次迭代 json 对象

python---django中自带分页类使用